informix jdbc卡住连接

我正在尝试使用标准方式使用jdbc连接到Informix数据库服务器:

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) 

尝试运行连接do Informix数据库的代码,但也显示完整的exception信息并创建跟踪文件。 一个跟踪文件用于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. 

(我用波兰语翻译了它,所以它可能会有所不同)

我的建议是:

  1. 构建ConnectString并向我们展示其完整内容,这样我们将看到ip中是否只有IP地址或者是否带有端口号
  2. 而不是添加用户名和密码到ConnectString使用3参数版本的getConnection()就像:

     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等工具。 开始捕获到Informix数据库的ip流量。 就我而言,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 

IBM 表示 : From 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. From 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 Driver程序包。

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

  2. 编译simple.java

    c:\ Infx \ Java> javac simple.java

  3. 确保正确设置了SQLIDEBUG

    c:\ Infx \ Java> grep SQLIDEBUG simple.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> del trace *

  5. 运行java.simple

    c:\ Infx \ Java> java simple systables syscolumns …… oledbordinals

  6. 然后找到跟踪文件

    c:\ Infx \ Java> dir trace *驱动器C中的卷没有标签。 卷序列号为B823-46D8

    c:\ Infx \ Java目录

    04/04/2006 14:12 20,560 trace1144156355642.0 1文件20,560字节0 Dir(s)4,067,995,648字节免费

    C:\ INFX \的Java>

    您将能够看到已创建跟踪文件,但您将无法读取该文件。

  7. 将跟踪文件发送到您当地的技术支持办事处进行分析。

当然,如果您没有使用Informix驱动程序的3.00.JC1版本,请忽略上述内容并遵循不同的指令集 ; 再次复制以方便您:

要打开跟踪,请在建立与Informix数据库或数据库服务器的连接时,在数据库URL或属性列表中指定环境变量TRACE,TRACEFILE,PROTOCOLTRACE和PROTOCOLTRACEFILE。 TRACE可以设置为以下级别之一:

  1. 跟踪未启用。 这是默认值。
  2. 跟踪方法的入口和出口点。
  3. 与级别1相同,还会跟踪一般错误消息。
  4. 与级别2相同,还跟踪数据变量。 TRACEFILE指定写入TRACE消息的客户端计算机上的操作系统文件的完整路径名。

PROTOCOLTRACE跟踪Java程序和Informix数据库服务器之间发送的SQLI协议消息。

可以设置为以下级别:

  1. 协议跟踪未启用。 这是默认值。
  2. 跟踪消息ID。
  3. 与级别1相同,还会跟踪消息包中的数据。 PROTOCOLTRACFILE指定要写入PROTOCOLTRACE消息的客户端计算机上的操作系统文件的完整路径名。

希望有所帮助

  1. 尝试不同的jdbc版本
  2. 检查NETTYPE配置参数,并将其与当前的informix会话数进行比较
  3. 当jdbc连接挂起时,转储java线程状态(kill -3)
 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

我遇到的问题是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=;password=' * * Expected result: * * >>>Simple Connection test. * URL = "jdbc:informix-sqli://myhost:1533:user=;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."); } }