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

Posted

技术标签:

【中文标题】通过 JDBC 连接到远程 db2 数据库失败【英文标题】:Connection to remote db2 database through JDBC fails 【发布时间】:2015-12-30 16:12:55 【问题描述】:

我是 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:      

【问题讨论】:

作为旁注,从 JDBC 4.0 / Java 6 开始,不再需要调用 Class.forName() @Sachin Giri,你解决问题了吗?似乎我有完全相同的错误。 【参考方案1】:

您是否在 Java 7 中使用 AES 加密机制?如果是这样,我通过 Googull 在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("****", "*****")这样连接

另外...见this similar question

【讨论】:

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

以上是关于通过 JDBC 连接到远程 db2 数据库失败的主要内容,如果未能解决你的问题,请参考以下文章

如何远程连接到db2数据库

在 Shell 脚本中通过 JDBC 连接到 DB2

带有实例名称的 DB2 JDBC 连接 url

通过远程jdbc方式连接到hive数据仓库

使用 cli 连接到 db2 失败,错误代码为 -1531

通过 SQOOP 连接到 DB2 时出现连接管理器错误