2014-02-05 138 views
1

我試圖用標準的方式使用JDBC連接到Informix數據庫服務器:Informix的JDBC連接卡住

connection = DriverManager.getConnection("jdbc:informix-sqli://"+ip+ 
/"+sid+":INFORMIXSERVER="+server+";user="+user+";password="+pass+""); 

但它不停地嘗試連接並不會引發錯誤信息(我想它會嘗試連接,因爲它沒有顯示任何東西)。我正在使用IBM Informix驅動程序4.10.00.1534和Java 1.7。 我一直使用這種方法連接到Informix服務器,直到現在,實際上它只有一個服務器失敗。我可以通過帶有odbc的Informix客戶端連接到此服務器,但是它始終與jdbc一起失敗,並且沒有錯誤消息。

是否有任何方法來詳細jdbc連接?任何有關爲什麼失敗的建議?

進展:sqlidebug跟蹤:

C->S (4)    
    SQ_VERSION 
    SQ_EOT 

S->C (14)   
    SQ_VERSION 
     "7.31.TD6" [8] 
    SQ_EOT 

C->S (66)   
    SQ_INFO 
     INFO_ENV 
      Name Length = 12 
      Value Length = 8 
      "DBTIME"="%d/%M/%Y" 
      "DBTEMP"="/tmp" 
      "SUBQCACHESZ"="10" 
     INFO_DONE 
    SQ_EOT 

S->C (2)    
    SQ_EOT 

C->S (16)   
    SQ_DBOPEN 
     "database" [8] 
     NOT EXCLUSIVE 
    SQ_EOT 

S->C (28)   
    SQ_DONE 
     Warning..: 0x15 
     # rows...: 0 
     rowid....: 0 
    serial id: 0 
SQ_COST 
    estimated #rows: 1 
    estimated I/O..: 1 
SQ_EOT 

C->S (78)   
    SQ_PREPARE 
     # values: 0 
     CMD.....: "select site from informix.systables where tabname = ' GL_COLLATE'" [65] 
    SQ_NDESCRIBE 
    SQ_WANTDONE 
    SQ_EOT 

而且jdbctrace.log說:

trying com.informix.jdbc.IfxDriver 
    SQLWarning: reason(Database selected) SQLState(01I04) 
    SQLWarning: reason(Float to decimal conversion has been used) SQLState(01I05) 
    SQLWarning: reason(Database has transactions) SQLState(01I01) 
    SQLWarning: reason(Database selected) SQLState(01I04) 
    SQLWarning: reason(Database has transactions) SQLState(01I01) 
    SQLWarning: reason(Database selected) SQLState(01I04) 

回答

0

嘗試運行連接做Informix數據庫的代碼,但也顯示出充分的異常信息,並創建跟蹤文件。一個跟蹤文件用於JDBC,一個用於Informix。將URL更改爲數據庫,用戶名和密碼,然後運行。你可能會在屏幕上看到或跟蹤文件的問題:

import java.io.FileWriter; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

class informix_trace 
    { 
    public static void main(String[] args) 
     { 
     try 
      { 
      Class.forName("com.informix.jdbc.IfxDriver"); 
      FileWriter fwTrace = new FileWriter("c:\\JDBCTrace.log"); 
      PrintWriter pwTrace = new PrintWriter(fwTrace); 
      DriverManager.setLogWriter(pwTrace); 
      String debug_url = "SQLIDEBUG=C:\\sqlidebug.trace"; 
      String url = "jdbc:informix-sqli://1.2.3.4:9088/test_db:informixserver=ol_testifx;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250;" + debug_url 
      Connection connection = DriverManager.getConnection(url, "user", "passwd"); 
      Statement statement = connection.createStatement(); 
      ResultSet resultSet = statement.executeQuery("SELECT FIRST 1 DBINFO('version','full') FROM systables;"); 
      while (resultSet.next()) 
       System.out.println(resultSet.getObject(1)); 
      } 
     catch (Exception e) 
      { 
      e.printStackTrace(); 
      } 
     } 

    } // class informix_trace 

Informix的跟蹤文件將與一些後綴(時間戳或類似信息),並在我的情況下,它是像sqlidebug.trace1391758523500.0。它是二進制文件,但您可以使用sqliprt實用程序進行分析。我有錯誤的數據庫名稱會話的

例子:

c:\>sqliprt sqlidebug.trace1391758523500.0 
SQLIDBG Version 1 
    ... 
S->C (12) 
       SQ_ERR 
           SQL error..........: -329 
           ISAM/RSAM error....: -111 
           Offset in statement: 0 
           Error message......: "" [0] 
       SQ_EOT 

JDBCTrace.log我能發現更多有趣的信息(我認爲這也是我的屏幕上):

SQLState(IX000) vendor code(-111) 
java.sql.SQLException: ISAM error: no record found. 
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413) 
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3412) 
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2324) 
    .... 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at informix_trace.main(informix_trace.java:20) 
getConnection failed: java.sql.SQLException: No database found or wrong system privileges. 

(我把它翻譯來自波蘭,所以它可以有點不同)

+0

我已經嘗試了您建議的調試語句,並且它沒有完成打印調試文件,在某些點凍結並且不會繼續打印。我已經用結果更新了答案。再次感謝 – xacy

0

我的建議是:

  1. 構建ConnectString中向我們展示它的全部內容,這樣我們會看到ip中是否只有IP地址或者是否帶有端口號
  2. 而不是添加用戶名和密碼CONNECTSTRING的getConnection()使用3個參數的版本只是想:

    getConnection("jdbc:informix-sqli://169.0.5.10:9088/test_db:informixserver=ol_test;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250", username, password) 
    

(當然設定自己的區域,而不是我的波蘭環境)

間諜網絡流量使用工具如Wireshark。開始將IP流量捕獲到您的Informix數據庫。在我的情況下,Wireshark的規則是:

ip.addr == 169.0.5.10 

如果我設置了錯誤的IP,Wireshark將顯示「Destination unreachable」。

您還可以用netstat看到成才:

c:\>netstat -an | grep 9088 
    TCP 169.0.1.126:4295  169.0.5.10:9088  TIME_WAIT 

這是當我的應用程序停止工作。

在錯誤的情況下(錯誤的IP端口)我看到:

c:\>netstat -an | grep 9089 
    TCP 169.0.1.126:4398  169.0.5.10:9089  SYN_SENT 
+0

我已經試過你對的getConnection的'3參數版本()'和使用netstat建議(我不能在這裏安裝的Wireshark)。 3 paremeter版本不會改變任何東西,它會一直嘗試連接,並且不會返回錯誤代碼(url建立在ip:port標準中),並且收集的netstat信息僅表示與服務器建立了連接但似乎沒有迴應。非常感謝您的寶貴時間。 – xacy

0

IBM says thatFrom version 3.00.JC1 of IBM® Informix® JDBC Driver onwards, debug drivers are no longer shipped. Informix JDBC Driver now supports SQLIDEBUG. You no longer need to set values for TRACE, TRACEFILE or PROTOCOLTRACE, PROTOCOLTRACEFILE. You only need to set SQLIDEBUG.和頁面繼續概述你需要創建一個步驟追查。複製:

  1. 設置CLASSPATH到Informix JDBC驅動程序包。

    c:\ Infx \ Java> set CLASSPATH = C:\ infx \ JDBC3.00JC3 \ lib \ ifxjdbc.jar; C:\ infx \ JDBC3.00JC3 \ lib \ ifxjdbcx.jar ;.

  2. 編譯Simple.java

    C:\ INFX \爪哇>的javac simple.java

  3. 確保SQLIDEBUG設置正確

    C:\ INFX \爪哇>的grep SQLIDEBUG簡單。 java
    conn = DriverManager.getConnection(「jdbc:informix-sqli:// irk:1526/sysmaster:INFORMIXSERVER = irk940; USER = informix; PASSWORD = ximrofni; SQLIDEBUG = C:\ infx \ java \ trace」);

    注意:SQLIDEBUG在連接字符串中設置。它指向的地方 跟蹤文件將具有一定的格式,即 trace.xxxxxxx

  4. 刪除找到或移動所有其他跟蹤文件

    C:\ INFX \的Java>德爾跟蹤*

  5. 運行java.simple

    C:\ INFX \的Java> Java的簡單SYSTABLES syscolumns中...... oledbordinals

  6. 然後找到跟蹤文件

    c:\ Infx \ Java> dir trace *驅動器C中的卷沒有標籤。體積 序列號是B823-46D8

    的C指南:\ INFX \爪哇

    04/04/2006 14:12 20560 trace1144156355642.0 1文件(一個或多個)20560個字節 風向(多個)4067995648字節免費

    C:\ INFX \的Java>

    你將能夠看到一個跟蹤文件已創建但是 您將無法讀取該文件。

  7. 將跟蹤文件發送到您當地的技術支持辦事處進行 分析。

當然,如果你不使用Informix驅動程序的版本3.00.JC1,忽略上述和follow a different set of instructions;再次重複爲了您的方便:

打開跟蹤,指定的環境變量TRACE, TRACEFILE,PROTOCOLTRACE和PROTOCOLTRACEFILE數據庫URL或 財產清單,當你建立到Informix 數據庫的連接或數據庫服務器TRACE可以設置爲以下之一 級別:

  1. 跟蹤未啓用。這是默認值。
  2. 追蹤方法的入口和出口點。
  3. 與級別1相同,還會跟蹤通用錯誤消息。
  4. 與2級相同,還會追蹤數據變量。 TRACEFILE指定寫入TRACE消息的客戶機 計算機上的操作系統文件的完整路徑名。

PROTOCOLTRACE跟蹤您的Java 程序和Informix數據庫服務器之間發送的SQLI協議消息。

可以設置爲以下級別:跟蹤未啓用

  1. 協議。這是默認值。
  2. 跟蹤消息ID。
  3. 與級別1相同,還會跟蹤消息數據包中的數據。 PROTOCOLTRACFILE指定寫入PROTOCOLTRACE消息 的客戶端計算機上正在運行的 系統文件的完整路徑名。

希望幫助

0
  1. 嘗試不同的JDBC版本
  2. 檢查NETTYPE配置參數,並與Informix的會話的當前數量比較
  3. 轉儲Java線程狀態(殺死-3)時jdbc連接掛起
0
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import com.informix.*; 
public class DBConnect { 
    static String url="jdbc:informix-sqli://host_name:port/database_name:INFORMIXSERVER=server;user=username;password=password"; 

    public static void main(String [] args){ 
     try { 
      Class.forName("com.informix.jdbc.IfxDriver"); 
     }catch (Exception e){ 
      System.out.println("ERROR: failed to load Informix JDBC driver."); 
      e.printStackTrace(); 
      return; 
     } 
     try{ 

      DriverManager.registerDriver((com.informix.jdbc.IfxDriver)Class.forName("com.informix.jdbc.IfxDriver").newInstance()); 

     }catch(Exception ex){ 
      System.out.println("Driver is not Registered"); 
     } 
     try{ 

      Connection conn = DriverManager.getConnection(url); 
      System.out.println("Connection Successful"); 
     }catch (SQLException e){ 
      System.out.println("ERROR: failed to connect!"); 
      System.out.println("ERROR: " + e.getMessage()); 
      e.printStackTrace(); 
      return; 
     } 
     } 
} 

欲瞭解更多信息請至[這本書](http://www.cursor-distribution.de/aktuell.11.70.xC6/documentation/ids_jdbc_bookmap.pdf

0

我遇到的是Informix的是在端口7360上監聽本地IPv6地址的問題,指揮netstat -a被顯示格式爲:

TCP [feab::11ab:78ab:efab:8aab%17]:7360 myhostname:0  LISTENING 

因此,我的JDBC連接總是失敗,直到我想通了,我應該在URL中使用IPv6地址:

jdbc:informix-sqli://fe80::1125:78c0:ef17:8ab5%17:7360:user=informix;password=test;INFORMIXSERVER=ol_informix1210_2

您可以測試該連接正在與這個簡單的腳本:

/*************************************************************************** 
* 
* Title:   SimpleConnection.java 
* 
* Description: Demo a connection to a server (no database specified) 
*  
* An example of running the program: 
*  
* java SimpleConnection 
*  'jdbc:informix-sqli://myhost:1533:user=<username>;password=<password>' 
*  
* Expected result: 
* 
* >>>Simple Connection test. 
* URL = "jdbc:informix-sqli://myhost:1533:user=<username>;password=<password>" 
* >>>End of Simple Connection test. 
* 
*************************************************************************** 
*/ 

import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public class SimpleConnection { 

    public static void main(String[] args) { 
     if (args.length == 0) { 
      System.out.println("FAILED: connection URL must be provided in order to run the demo!"); 
      return; 
     } 

     String url = args[0]; 

     String testName = "Simple Connection"; 

     Connection conn = null; 

     System.out.println(">>>" + testName + " test."); 
     System.out.println("URL = \"" + url + "\""); 

     try { 
      Class.forName("com.informix.jdbc.IfxDriver"); 
     } catch (Exception e) { 
      System.out.println("FAILED: failed to load Informix JDBC driver."); 
     } 

     try { 
      PrintWriter out = new PrintWriter(System.out, true); 
      DriverManager.setLogWriter(out); 
      conn = DriverManager.getConnection(url); 
     } catch (SQLException e) { 
      System.out.println("FAILED: failed to connect!"); 
     } 

     try { 
      conn.close(); 
     } catch (SQLException e) { 
      System.out.println("FAILED: failed to close the connection!"); 
     } 

     System.out.println(">>>End of " + testName + " test."); 
    } 
}