通过JDBC连接远程db2数据库失败。

4

我是db2的新手。我想问一下是否可以仅通过我的Java应用程序连接到远程db2服务器上的db2数据库?仅使用类型为4的jdbc驱动程序即可吗?

我在构建路径中有db2jcc4驱动程序。

当我尝试这个简单的代码时

 public static void main(String[] args) {
        Class.forName("com.ibm.db2.jcc.DB2Driver");
        System.out.println("Driver loaded");

        try {
            Connection dbConn =     DriverManager.getConnection("jdbc:db2://192.168.0.103:50000/ABC", "****", "*****");
        } catch (SQLException e) {
            e.printStackTrace();
        }

}

使用这个异常连接失败。我无法追踪具体发生了什么?

 com.ibm.db2.jcc.am.SqlException: [jcc][t4][10262][11223][4.19.26] Unexpected Throwable caught: null. ERRORCODE=-4228, SQLSTATE=null
at com.ibm.db2.jcc.am.kd.a(Unknown Source)
at com.ibm.db2.jcc.am.kd.a(Unknown Source)
at com.ibm.db2.jcc.am.kd.a(Unknown Source)
at com.ibm.db2.jcc.t4.b.b(Unknown Source)
at com.ibm.db2.jcc.t4.b.a(Unknown Source)
at com.ibm.db2.jcc.t4.b.a(Unknown Source)
at com.ibm.db2.jcc.t4.b.a(Unknown Source)
at com.ibm.db2.jcc.t4.b.<init>(Unknown Source)
at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(Unknown Source)
at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(Unknown Source)
at com.ibm.db2.jcc.DB2Driver.connect(Unknown Source)
at com.ibm.db2.jcc.DB2Driver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at com.connect.db2.ConnectToServer.main(ConnectToServer.java:22)


 Caused by: java.lang.NullPointerException
at com.ibm.db2.jcc.am.Connection.completeSqlca(Unknown Source)
at com.ibm.db2.jcc.t4.z.q(Unknown Source)
at com.ibm.db2.jcc.t4.z.p(Unknown Source)
at com.ibm.db2.jcc.t4.z.l(Unknown Source)
at com.ibm.db2.jcc.t4.z.d(Unknown Source)
at com.ibm.db2.jcc.t4.b.k(Unknown Source)
at com.ibm.db2.jcc.t4.b.b(Unknown Source)
at com.ibm.db2.jcc.t4.b.a(Unknown Source)
... 12 more

此外,在执行getconnection操作后,db2diag.log 的内容为:
 PID     : 5110                 TID : 140245920114432 PROC : db2sysc 0
 INSTANCE: sachindb             NODE : 000            DB   : ABC
 APPHDL  : 0-46                 APPID: 192.168.0.101.64054.151230182945
 AUTHID  : SACHINDB             HOSTNAME: Sachin
 EDUID   : 22                   EDUNAME: db2agent (ABC) 0
 FUNCTION: DB2 UDB, base sys utilities, sqleIsDatabaseDirectoryConnectable, probe:6835
 MESSAGE : ZRC=0x8005006D=-2147155859=SQLE_CA_BUILT
      "SQLCA has been built and saved in component specific control   block."
 DATA #1 : SQLCA, PD_DB2_TYPE_SQLCA, 136 bytes
 sqlcaid : SQLCA     sqlcabc: 136   sqlcode: -1035   sqlerrml: 0
 sqlerrmc: 
 sqlerrp : SQLE534 
 sqlerrd : (1) 0x00000000      (2) 0x00000000      (3) 0x00000000
       (4) 0x00000000      (5) 0x00000000      (6) 0x00000000
 sqlwarn : (1)      (2)      (3)      (4)        (5)       (6)    
       (7)      (8)      (9)      (10)        (11)     
 sqlstate:      

1
作为旁注,自JDBC 4.0 / Java 6起,不再需要调用Class.forName() - Andy Guibert
1
@Sachin Giri,你解决问题了吗? 看起来我也遇到了完全相同的错误。 - Sergey Bespalov
1个回答

0

你在Java 7中使用AES加密机制吗?如果是的话,我通过谷歌在IBM.com找到了这个解决方案。

否则,尝试直接创建一个DB2SimpleDataSource对象。

private DB2SimpleDataSource db2;
private void configureDataSource() {

     db2 = new DB2SimpleDataSource();
     db2.setServerName("192.168.0.103");
     db2.setPortNumber(50000);
     db2.setDatabaseName("ABC");
     db2.setUser("****");
     db2.setPassword("*****");
     db2.setReadOnly(true);          
}

接着像这样连接 Connection c = db2.getConnection() 或者这样 Connection c = db2.getConnection("****", "*****")

还有...请参考 这个类似问题


我无法使用type2驱动程序,因为它需要一些在Db2数据服务器客户端中的本地库。所以我不能使用上述方法,我尝试过了,但它给了我关于本地库的不同异常。另外,我没有使用AES加密。我还尝试将那些无限制策略jar文件放入我的java home/jre/lib/security中。但是没有运气。 - Sachin Giri
嗯,我专门使用第四类型的驱动程序,在混淆之前,上述代码直接来自我的一个项目...但是我没有任何关于数据库管理方面的经验。我的公司有DBA直接与DB2交互,我连接的唯一方式是通过JDBC。 - geneSummons
DB2 Command Center在底层使用JDBC。您能否从运行JDBC应用程序的计算机上连接到Command Center中的数据库? - geneSummons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接