【问题标题】:db2 driver error but able to establish connectiondb2 驱动错误但能够建立连接
【发布时间】:2016-08-09 06:22:32
【问题描述】:

我正在尝试将C3P0 连接池用于 IBM DB2 Version 10.5.5 Fix Pack 5 和 Java 8。

最初,我收到了this error,所以我将 jar 更改为db2jcc4.jar,但我仍然在控制台中遇到以下错误,

1350 [C3P0PooledConnectionPoolManager[identityToken->2x0fal9iui9mpmdj6im3|c2e1f26]-HelperThread-#1] INFO  com.mchange.v2.c3p0.SQLWarnings  – Origination unknown: [10228][11541][4.11.77] Security exceptions occurred while loading driver. ERRORCODE=4223, SQLSTATE=null
com.ibm.db2.jcc.am.SqlWarning: Origination unknown: [10228][11541][4.11.77] Security exceptions occurred while loading driver. ERRORCODE=4223, SQLSTATE=null
    at com.ibm.db2.jcc.am.gd.b(gd.java:207)
    at com.ibm.db2.jcc.am.gd.b(gd.java:258)
    at com.ibm.db2.jcc.am.jb.a(jb.java:887)
    at com.ibm.db2.jcc.am.lb.a(lb.java:574)
    at com.ibm.db2.jcc.am.lb.<init>(lb.java:555)
    at com.ibm.db2.jcc.t4.b.<init>(b.java:305)
    at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:214)
    at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:460)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
Caused by: java.security.PrivilegedActionException: java.lang.ClassNotFoundException: sun.io.ByteToCharConverter
    at java.security.AccessController.doPrivileged(Native Method)
    at com.ibm.db2.jcc.am.jb.r(jb.java:873)
    at com.ibm.db2.jcc.am.jb.<clinit>(jb.java:484)
    at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:117)
    ... 9 more
Caused by: java.lang.ClassNotFoundException: sun.io.ByteToCharConverter
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.ibm.db2.jcc.am.jg.run(jg.java:19)
    ... 13 more
1350 [C3P0PooledConnectionPoolManager[identityToken->2x0fal9iui9mpmdj6im3|c2e1f26]-HelperThread-#0] INFO  com.mchange.v2.c3p0.SQLWarnings  – Origination unknown: [10228][11541][4.11.77] Security exceptions occurred while loading driver. ERRORCODE=4223, SQLSTATE=null
com.ibm.db2.jcc.am.SqlWarning: Origination unknown: [10228][11541][4.11.77] Security exceptions occurred while loading driver. ERRORCODE=4223, SQLSTATE=null
    at com.ibm.db2.jcc.am.gd.b(gd.java:207)
    at com.ibm.db2.jcc.am.gd.b(gd.java:258)
    at com.ibm.db2.jcc.am.jb.a(jb.java:887)
    at com.ibm.db2.jcc.am.lb.a(lb.java:574)
    at com.ibm.db2.jcc.am.lb.<init>(lb.java:555)
    at com.ibm.db2.jcc.t4.b.<init>(b.java:305)
    at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:214)
    at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:460)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
Caused by: java.security.PrivilegedActionException: java.lang.ClassNotFoundException: sun.io.ByteToCharConverter
    at java.security.AccessController.doPrivileged(Native Method)
    at com.ibm.db2.jcc.am.jb.r(jb.java:873)
    at com.ibm.db2.jcc.am.jb.<clinit>(jb.java:484)
    at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:117)
    ... 9 more
Caused by: java.lang.ClassNotFoundException: sun.io.ByteToCharConverter
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.ibm.db2.jcc.am.jg.run(jg.java:19)
    ... 13 more

即使日志中出现此错误,我的独立 Java 应用程序也能够连接到数据库并获得结果,即 SELECT 查询已成功执行。

如何解决这种混乱?

【问题讨论】:

    标签: jdbc db2 c3p0


    【解决方案1】:

    您看到的堆栈跟踪来自 SqlWarning 对象,这可能意味着它们不是致命或严重的问题。明显的问题java.lang.ClassNotFoundException: sun.io.ByteToCharConverter 似乎很奇怪。但是由于它是作为警告而不是作为异常抛出的,驱动程序可能已经从问题中恢复过来,这就是您的应用程序似乎可以工作的原因。

    JDBC 连接被允许存储a chain of SQLWarnings,它可能来自任何东西,但大多数应用程序会忽略它。 (大多数 JDBC 程序员甚至都不知道它们的存在。)

    c3p0 对于定期检查连接警告、记录它们然后清除它们非常神经质,这样连接的用户就不会看到来自先前客户端使用的警告。但是,警告的日志记录可能很烦人,因此,如果您愿意,可以很容易地抑制它(或将其重定向到单独的文件,或其他)。 c3p0 将警告记录到名为com.mchange.v2.c3p0.SQLWarnings 的特殊记录器中。在您使用的任何日志记录库的配置文件中,您可以通过将该记录器的级别设置为 WARNING 或更高来抑制此输出。

    (有点令人困惑的是,SQLWarnings 记录在INFO 而不是WARNING。由于它们通常代表有关已恢复条件的信息,驱动程序作者知道大多数开发人员从未见过,因此它们实际上并没有上升到WARNING。因此,在INFO 及以下过滤掉来自com.mchange.v2.c3p0.SQLWarnings 的消息足以消除警告。如果您想查看负责的代码,它是here。)

    【讨论】:

    • 谢谢!!让我看看我是否可以在日志中抑制这些。
    • 在 c3p0.properties 文件中添加这两行会关闭这些日志,com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=WARNING com.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog
    • 就可以了!但它会抑制所有 INFO 级别的日志记录(不仅仅是com.mchange.v2.c3p0.SQLWarnings),并且只强制日志记录到标准错误。如果您的应用程序正在记录到 slf4j 或 log4j 或 java.util.logging,最好让 c3p0 记录到同一个地方,然后单独禁止记录。 (如果您的应用程序很小并且没有使用完整的日志库,则在 WARNING 处记录标准错误,您现在正在做的事情可能没问题。)
    • ClassNotFound 对我来说似乎并不奇怪:sun.io.ByteToCharConverter 包含在 Java JDK 7 中,但不再包含在 JDK 8 中。当然,IBM 使用这个内部 JDK 是值得怀疑的类在其驱动程序中。这很可能(希望?)在未来的驱动程序版本中得到修复。
    • 根据ibm.com/support/knowledgecenter/SSEPGG_11.1.0/…,IBM DB2 V10.5 的驱动程序只支持Java 6&7,从DB2 V11.1.0 开始也支持Java 8。
    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多