2016-03-01 86 views
2

我想連接遠程Oracle數據庫,但我有異常。請幫幫我。 我能做什麼?從Java連接到Oracle ...異常

我試過,但它不工作:

try { 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      Connection con = DriverManager.getConnection(
        "jdbc:oracle:thin:@*****:1521/******", "*********", 
        "********"); 
      Statement st = con.createStatement(); 
      con.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

四處錯誤:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
     at oracle.sql.converter.CharacterSetMetaData$JdbcCharacterSetMetaData.isFixedWidth(CharacterSetMetaData.java:1292) 
     at oracle.sql.converter.CharacterSetMetaData.getRatio(CharacterSetMetaData.java:1230) 
     at oracle.jdbc.driver.DBConversion.init(DBConversion.java:159) 
     at oracle.jdbc.driver.DBConversion.<init>(DBConversion.java:112) 
     at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1075) 
     at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301) 
     at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531) 
     at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) 
     at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
     at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) 
     at java.sql.DriverManager.getConnection(DriverManager.java:664) 
     at java.sql.DriverManager.getConnection(DriverManager.java:247) 
+1

嘗試發佈您的所有代碼 – Abdelhak

+0

Connection con = DriverManager.getConnection( 「jdbc:oracle:thin:@ *****:1521:******」,「******* **「, 」********「); ................刪除「/」並放入「:」 –

+0

您正在使用哪種版本的Oracle JDBC驅動程序,以及您連接的是哪個版本的Oracle? –

回答

0

你的連接URL是錯誤的格式。您正在混合SIDservice格式。

要麼

DriverManager.getConnection(
    "jdbc:oracle:thin:<user>/<password>@<host>:<port>:<sid>"); 

DriverManager.getConnection(
    "jdbc:oracle:thin:@<host>:<port>:<sid>", "<user>", "<password>"); 

或者如果你使用Properties對象連接到服務,而不是SID

DriverManager.getConnection(
    "jdbc:oracle:thin:<user>/<password>@//<host>:<port>/<service"); 

有關示例看看進javadoc of oracle.jdbc.OracleDriver

編輯這裏找到鏈接到Thin-style Service Name Syntax

編輯2啓用日誌記錄司機,看看是否會有一些有用的消息出現。

OracleLog.setTrace(true); 
DriverManager.setLogWriter(new PrintWriter(System.out)); 

編輯3下面的方式通過由服務器和驅動程序報告該字符集反射找到。

由於許可原因,包裝聲明很重要。

package oracle.jdbc.driver; 

import java.lang.reflect.Field; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import oracle.sql.CharacterSet; 
import sun.reflect.ReflectionFactory; 

public class OJdbcInfo { 

    public static void main(String[] args) throws Exception { 
     OracleLog.setTrace(true); 
     DriverManager.setLogWriter(new PrintWriter(System.out)); 

     System.out.printf("defaultCharset: %s%n", Charset.defaultCharset()); 
     System.out.printf("file.encoding : %s%n", 
      System.getProperty("file.encoding")); 

     String connectUrl = 
      "jdbc:oracle:thin:<user>/<password>@<host>:<port>:<sid>"; 

     try (Connection con = DriverManager.getConnection(connectUrl)) { 
      T4CConnection t4Conn = (T4CConnection) con; 
      T4C8TTIpro pro = t4Conn.pro; 

      short oVersion = pro.oVersion; 
      short svrCharSet = pro.svrCharSet; 
      short driverCharSet; 
      try { 
       driverCharSet = DBConversion.findDriverCharSet(
        svrCharSet, oVersion); 
      } catch (ArrayIndexOutOfBoundsException e) { 
       System.err.printf("failed to get driver charset: %s%n", 
        e.getMessage()); 
       driverCharSet = -1; 
      } 

      System.out.println("server charset: " + svrCharSet); 
      System.out.println("driver charset: " + driverCharSet); 

      Object instance = ReflectionFactory.getReflectionFactory() 
        .newConstructorForSerialization(
          Class.forName("oracle.sql.CharacterSetFactoryThin"), 
          Object.class.getConstructor()) 
        .newInstance(); 

      for (Field fs : CharacterSet.class.getDeclaredFields()) { 
       if (fs.getType() == short.class) { 
        if (fs.getShort(instance) == driverCharSet) { 
         System.out.printf("charset name : %s%n", fs.getName()); 
        } 
       } 
      } 
     } 
    } 
} 

編譯

mkdir bin 
javac -cp ojdbc6_g.jar -d bin/ OJdbcInfo.java 

運行

java -cp ojdbc6_g.jar:bin/ oracle.jdbc.driver.OJdbcInfo 

可能的輸出

defaultCharset: UTF-8 
file.encoding : UTF-8 
server charset: 873 
driver charset: 873 
charset name : AL32UTF8_CHARSET 

最大的可能是驅動程序的字符集是你的情況-1

檢查您使用的是最新的驅動程序版本。

java -jar ojdbc6.jar 

可能的輸出

Oracle 11.2.0.4.0 JDBC 4.0 compiled with JDK6 on Thu_Jul_03_18:17:32_PDT_2014 

檢查你的Linux機器的locale設置

locale 

可能的輸出(取決於您的語言設置,但所有的值通常應爲相同)

LANG=en_US.UTF-8 
LC_CTYPE="en_US.UTF-8" 
LC_NUMERIC="en_US.UTF-8" 
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8" 
LC_MONETARY="en_US.UTF-8" 
LC_MESSAGES="en_US.UTF-8" 
LC_PAPER="en_US.UTF-8" 
LC_NAME="en_US.UTF-8" 
LC_ADDRESS="en_US.UTF-8" 
LC_TELEPHONE="en_US.UTF-8" 
LC_MEASUREMENT="en_US.UTF-8" 
LC_IDENTIFICATION="en_US.UTF-8" 
+0

謝謝你的迴應。但我已經嘗試過了,問題與你的解釋無關。 –

+0

但是類T4CConnection和T4C8TTIpro不是公開的,我怎麼能打電話給他們? –

+0

謝謝你的回覆。是這個問題。在我的Oracle參數庫中,我的NLS_CHARACTERSET不是AL32UTF8。如何在程序中顯示我的NLS_CHARACTERSET? –

0

我測試你的代碼中使用

DriverManager.getConnection(
    "jdbc:oracle:thin:@<host>:<port>:<sid>", "<user>", "<password>"); 

所以刪除<port>/<sid>之間/<port>:<sid>

Your updated code will be

Connection con = DriverManager.getConnection(
        "jdbc:oracle:thin:@*****:1521:******", "*********", 
        "********"); 

之間放:和進一步的細節可以參考此鏈接http://docs.oracle.com/cd/E11882_01/appdev.112/e12137/getconn.htm#TDPJD136

我希望,它會幫助你。

+0

謝謝你的回覆。我做到了但不是問題。如果我在代碼中遇到問題,我不認爲這個異常是「線程中的異常」main「java.lang。ArrayIndexOutOfBoundsException:-1「 –

+0

@SaftarMurtuzov,你可以在完整跟蹤或日誌文件中跟蹤錯誤或異常,然後只更新你在異常處的那段代碼 –

+0

Connection con = DriverManager.getConnection( 」jdbc:oracle:瘦:@ *****:1521:******「,」*********「, 」********「);級別 –