我正在编写一个在数据库上做一些事情的程序。允许用户通过传递数据库主机端口,类型和凭据来配置数据库进程。值正确时,一切正常。但是,当用户传递无效的凭据时,我想显示一个错误。所以这是我创建连接池的部分
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setJdbcUrl( connectionUrl );
cpds.setUser(username);
cpds.setPassword(password);
稍后再验证连接是否正常
cpds.getConnection()
我希望得到一些带有供应商特定错误的SQLException,该错误表示凭据无效(在您使用典型的DriverManager方法获取连接时会发生这种情况),但是该过程一直等到引发连接签出异常为止
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)
....
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@20014b8 -- timeout at awaitAvailable()
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1467)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)
... 66 more
如何确定c3p0存在无效的凭证问题?
验证提供的凭据/ JDBC参数的最佳方法是完全避免连接池。
为此目的打开专用连接,并尝试针对新连接(例如SELECT 1
,类似的连接)执行最简单的SQL 。成功后,您可以将它们传递给C3P0,否则将错误传播回用户。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句