检测传递给c3p0连接池的无效凭据

时间:2016-02-29 13:54:07

标签: java connection-pooling c3p0

我正在编写一个在数据库上做一些事情的程序。允许用户通过传递db主机端口,类型和凭据来配置数据库进程。当值正确时,一切正常。但是当用户传递无效凭据时,我想显示错误。所以这是我创建连接池的部分

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存在无效的凭据问题?

2 个答案:

答案 0 :(得分:2)

验证提供的凭据/ JDBC参数的最佳方法是完全避免使用连接池。

仅为此目的打开专用连接,并尝试针对新连接执行最简单的SQL(例如SELECT 1或类似)。 成功后,您可以将它们传递给C3P0,否则将错误传播回用户。

答案 1 :(得分:1)

JDBC提供程序可以自由地创建他们想要的任何错误/异常消息。因此,您需要准备好解析每个提供程序的错误消息,以便了解正在发生的事情。

您还可以尝试从异常类型获取信息,如果,JDBC提供程序会在不同类型中隔离错误。

作为旁注,提供有关连接失败原因的过多信息可能会被视为安全漏洞。因此,不应期望JDBC驱动程序能够为您提供此类信息。例如,为什么任何数据库都会通过说“用户名是正确的,但密码不是。”来与入侵企图协作?

相关问题