2014-02-05 141 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."); 
    } 
}