我正在尝试使用标准方式使用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)
答案 0 :(得分:0)
我的建议是:
ip
中是否只有IP地址或者是否有端口号而不是为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等工具。开始捕获到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 that: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.
,页面继续概述了创建跟踪所需的步骤。复制:
将CLASSPATH设置为Informix JDBC Driver程序包。
C:\ INFX \爪哇>设置 CLASSPATH = C:\ INFX \ JDBC3.00JC3 \ lib中\ ifxjdbc.jar; C:\ INFX \ JDBC3.00JC3 \ lib中\ ifxjdbcx.jar;
编译simple.java
c:\ Infx \ Java> javac simple.java
确保正确设置了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
删除或移动所有其他跟踪文件
c:\ Infx \ Java> del trace *
运行java.simple
c:\ Infx \ Java> java simple systables syscolumns ...... oledbordinals
然后找到跟踪文件
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;
您将能够看到已创建跟踪文件 你将无法阅读该文件。
- 醇>
将跟踪文件发送到您当地的技术支持办事处 分析
当然,如果您没有使用Informix驱动程序的3.00.JC1版本,请忽略上述内容和follow a different set of instructions;再次复制以方便您:
要启用跟踪,请指定环境变量TRACE, 数据库URL或中的TRACEFILE,PROTOCOLTRACE和PROTOCOLTRACEFILE 建立与Informix的连接时的属性列表 数据库或数据库服务器TRACE可以设置为以下之一 级别:
- 未启用跟踪。这是默认值。
- 跟踪方法的进入和退出点。
- 与级别1相同,还会跟踪一般错误消息。
- 与级别2相同,也跟踪数据变量。 TRACEFILE指定客户端上操作系统文件的完整路径名 写入TRACE消息的计算机。
醇>PROTOCOLTRACE跟踪Java之间发送的SQLI协议消息 程序和Informix数据库服务器。
可以设置为以下级别:
- 未启用协议跟踪。这是默认值。
- 跟踪消息ID。
- 与级别1相同,并且还跟踪消息包中的数据。 PROTOCOLTRACFILE指定操作的完整路径名 PROTOCOLTRACE消息所在的客户端计算机上的系统文件 写的。
醇>
希望有所帮助
答案 3 :(得分:0)
答案 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.");
}
}