informix jdbc卡住连接

时间:2014-02-05 08:35:25

标签: java jdbc informix

我正在尝试使用标准方式使用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)

6 个答案:

答案 0 :(得分: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)
    
  3. (当然设置你自己的语言环境而不是我的波兰语语言环境)

    要窥探网络流量,请使用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
    

答案 1 :(得分:0)

尝试运行连接do 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.

(我已将它翻译成波兰语,所以它可能会有所不同)

答案 2 :(得分: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 Driver程序包。

         

    C:\ INFX \爪哇>设置   CLASSPATH = C:\ INFX \ JDBC3.00JC3 \ lib中\ ifxjdbc.jar; C:\ INFX \ JDBC3.00JC3 \ lib中\ ifxjdbcx.jar;

  2.   
  3. 编译simple.java

         

    c:\ Infx \ Java> javac simple.java

  4.   
  5. 确保正确设置了SQLIDEBUG

         

    c:\ Infx \ Java> grep SQLIDEBUG simple.java
      康恩=的DriverManager.getConnection(“JDBC:INFORMIX-SQLI:// IRK:1526 / SYSMASTER:INFORMIXSERVER = irk940; USER = Informix的;   PASSWORD = ximrofni; SQLIDEBUG = C:\ infx \ java \ trace“);

         

    注意:SQLIDEBUG在连接字符串中设置。它指向哪里   跟踪文件将以某种格式找到,即   trace.xxxxxxx

  6.   
  7. 删除或移动所有其他跟踪文件

         

    c:\ Infx \ Java> del trace *

  8.   
  9. 运行java.simple

         

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

  10.   
  11. 然后找到跟踪文件

         

    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和GT;

         

    您将能够看到已创建跟踪文件   你将无法阅读该文件。

  12.   
  13. 将跟踪文件发送到您当地的技术支持办事处   分析

  14.   

当然,如果您没有使用Informix驱动程序的3.00.JC1版本,请忽略上述内容和follow a different set of instructions;再次复制以方便您:

  

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

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

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

         

    可以设置为以下级别:

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

希望有所帮助

答案 3 :(得分:0)

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

答案 4 :(得分: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

答案 5 :(得分: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.");
    }
}