You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:14:34