使用Informix JDBC驱动15.0.0.0连接Informix 11.50数据库时触发IllegalMonitorStateException异常的问题求助
Informix JDBC驱动15.0.0.0连接Informix 11.50数据库时触发IllegalMonitorStateException异常的问题求助
大家好,我最近在测试Informix JDBC驱动新版本时碰到了一个很棘手的问题,想请各位帮忙分析下:
我一开始用的是4.50.JC11版本的驱动,测试数据库连接完全正常,多次连接测试的耗时都很稳定,具体测试过程和输出如下:
export CLASSPATH=jdbc-4.50.11.jar [mn:~/jdbc_connect_test] ./jdbc_connect_test_ifx.sh OS: Linux 6.12.13-200.fc41.x86_64 amd64 Java version: 21.0.6 Red Hat, Inc. -------------- JDBC drivers: com.informix.jdbc.IfxDriver@76ed5528 ver: 4.2 -------------- Test [jdbc:informix-sqli://test-informix.testd:9088/multi:informixserver=ol_testifx] JDBC driver version: '4.50.JC11'; major: 4; minor: 50 Test 1: 88 [ms] com.informix.jdbc.IfxSqliConnect@725bef66 Test 2: 14 [ms] com.informix.jdbc.IfxSqliConnect@2aaf7cc2 ...
但当我把CLASSPATH切换到15.0.0.0版本的驱动包jdbc-15.0.0.0.jar后,连接测试直接抛出了IllegalMonitorStateException异常,完全摸不着头脑:
export CLASSPATH=jdbc-15.0.0.0.jar [mn:~/jdbc_connect_test] ./jdbc_connect_test_ifx.sh OS: Linux 6.12.13-200.fc41.x86_64 amd64 Java version: 21.0.6 Red Hat, Inc. -------------- JDBC drivers: com.informix.jdbc.IfxDriver@7a81197d ver: 4.2 com.informix.jdbc.InformixDriver@27bc2616 ver: 15.0 -------------- Test [jdbc:informix-sqli://test-informix.testd:9088/multi:informixserver=ol_testifx] Exception in thread "main" java.lang.IllegalMonitorStateException at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:175) at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1059) at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:494) at com.informix.jdbc.IfxSqliConnect.unlockSession(IfxSqliConnect.java:2696) at com.informix.jdbc.IfxSqli.executeStatementQuery(IfxSqli.java:1239) at com.informix.jdbc.IfxResultSet.executeQuery(IfxResultSet.java:132) at com.informix.jdbc.IfxStatement.executeQuery(IfxStatement.java:744) at com.informix.jdbc.IfxStatement.executeQuery(IfxStatement.java:169) at com.informix.jdbc.IfxStatement.executeQuery(IfxStatement.java:157) at com.informix.jdbc.IfxSqliConnect.getSqlLogicalChar(IfxSqliConnect.java:3795) at com.informix.jdbc.IfxDatabaseMetaData.<init>(IfxDatabaseMetaData.java:306) at com.informix.jdbc.IfxSqliConnect.getMetaData(IfxSqliConnect.java:1737) at jdbc_connect_test.test_connection(jdbc_connect_test.java:34) at jdbc_connect_test.main(jdbc_connect_test.java:91)
我的测试代码里,一开始是在调用db.getMetaData()时触发的异常,后来换成简单的executeQuery()测试,结果还是抛出了同样的异常,测试代码片段如下:
public static void test_connection(int n, String jdbc_url, String jdbc_username, String jdbc_passwd) { long t0 = System.currentTimeMillis(); Connection db = null; try { try { db = DriverManager.getConnection(jdbc_url, jdbc_username, jdbc_passwd); long t2 = System.currentTimeMillis(); if (n == 0) { DatabaseMetaData dbmi = db.getMetaData(); System.out.format("JDBC driver version: '%s'; major: %s; minor: %s\n", dbmi.getDriverVersion(), dbmi.getDriverMajorVersion(), dbmi.getDriverMinorVersion()); } System.out.format("Test %2d: %5d [ms]\t%s\n", (n+1), (t2 - t0), db); } finally { if (db != null) db.close(); } } catch (SQLException e) { e.printStackTrace(); } }
后来我又做了更多测试,发现一个关键现象:15.0.0.0版本的驱动可以正常连接Informix 14.10版本的数据库,但一连接11.50版本的数据库就会触发这个异常。
测试1:15.0驱动连接14.10数据库(正常)
[mn:~/test/tools/javatools/jdbc_connect_test] ./jdbc_connect_test_ifx.sh OS: Linux 6.12.13-200.fc41.x86_64 amd64 Java version: 21.0.6 Red Hat, Inc. classpath: bson-5.3.1.jar:jdbc-15.0.0.0.jar: -------------- JDBC drivers: com.informix.jdbc.IfxDriver@3af49f1c ver: 4.2 com.informix.jdbc.InformixDriver@7106e68e ver: 15.0 -------------- Test [jdbc:informix-sqli://localhost:9088/stores_demo:INFORMIXSERVER=informix] db=JDBC Connection #1 db.isClosed()=false SELECT FIRST 1 DBINFO('version','full') FROM systables IBM Informix Dynamic Server Version 14.10.FC9W1DE JDBC driver version: '15.0.0'; major: 15; minor: 0 Test 1: 106 [ms] JDBC Connection #1 Test 2: 17 [ms] JDBC Connection #2 ...
测试2:15.0驱动连接11.50数据库(异常)
[mn:~/test/tools/javatools/jdbc_connect_test] ./jdbc_connect_test_ifx.sh OS: Linux 6.12.13-200.fc41.x86_64 amd64 Java version: 21.0.6 Red Hat, Inc. classpath: bson-5.3.1.jar:jdbc-15.0.0.0.jar: -------------- JDBC drivers: com.informix.jdbc.IfxDriver@3af49f1c ver: 4.2 com.informix.jdbc.InformixDriver@7106e68e ver: 15.0 -------------- Test [jdbc:informix-sqli://test-informix.testd:9088/multi:informixserver=ol_testifx] db=JDBC Connection #1 db.isClosed()=false SELECT FIRST 1 DBINFO('version','full') FROM systables Exception in thread "main" java.lang.IllegalMonitorStateException at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:175) at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1059) at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:494) at com.informix.jdbc.IfxSqliConnect.unlockSession(IfxSqliConnect.java:2696) at com.informix.jdbc.IfxSqli.executeStatementQuery(IfxSqli.java:1239) at com.informix.jdbc.IfxResultSet.executeQuery(IfxResultSet.java:132) at com.informix.jdbc.IfxStatement.executeQuery(IfxStatement.java:744) at com.informix.jdbc.IfxStatement.executeQuery(IfxStatement.java:169) at com.informix.jdbc.IfxStatement.executeQuery(IfxStatement.java:157) at jdbc_connect_test.showSelectResults(jdbc_connect_test.java:28) at jdbc_connect_test.test_connection(jdbc_connect_test.java:55) at jdbc_connect_test.main(jdbc_connect_test.java:114)
而用旧的4.50.JC11驱动连接11.50数据库是完全正常的:
[mn:~/test/tools/javatools/jdbc_connect_test] ./jdbc_connect_test_ifx.sh OS: Linux 6.12.13-200.fc41.x86_64 amd64 Java version: 21.0.6 Red Hat, Inc. classpath: bson-5.3.1.jar:jdbc-4.50.11.jar: -------------- JDBC drivers: com.informix.jdbc.IfxDriver@38af3868 ver: 4.2 -------------- Test [jdbc:informix-sqli://test-informix.testd:9088/multi:informixserver=ol_testifx] db=com.informix.jdbc.IfxSqliConnect@6d7b4f4c db.isClosed()=false SELECT FIRST 1 DBINFO('version','full') FROM systables IBM Informix Dynamic Server Version 11.50.FC4 JDBC driver version: '4.50.JC11'; major: 4; minor: 50 Test 1: 288 [ms] com.informix.jdbc.IfxSqliConnect@6d7b4f4c Test 2: 20 [ms] com.informix.jdbc.IfxSqliConnect@63e2203c ...
有没有朋友试过Informix JDBC驱动15.0.0.0版本并成功连接到11.50的数据库?或者能帮我分析下这个异常的原因?
备注:内容来源于stack exchange,提问作者Michał Niklas
相关产品推荐
相关产品推荐

