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

Java 检测传递到c3p0连接池的无效凭据,java,connection-pooling,c3p0,Java,Connection Pooling,C3p0,我正在写一个程序,在数据库上做一些事情。允许用户通过传递db主机端口、类型和凭据来配置db进程。当值正确时,一切正常。但当用户传递无效凭据时,我希望显示一个错误。下面是我创建连接池的部分 ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setJdbcUrl( connectionUrl ); cpds.setUser(username); cpds.setPassword(password); 稍后验证我所做的连接是

我正在写一个程序,在数据库上做一些事情。允许用户通过传递db主机端口、类型和凭据来配置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存在无效凭据问题?

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

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


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

验证提供的凭据/JDBC参数的最佳方法是根本避免连接池

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

我已准备好解析供应商异常消息,我已经具备了此功能。现在,我正在从单一连接移动到连接池,我希望保留现有的错误消息-我不会说密码不正确,只是凭据不正确。我需要通知用户,配置失败是因为他的输入,而不是因为其他问题(如db不可访问)@Nadir这不是我的意思。我的观点是JDBC驱动程序可能不会提供详细信息。因此,在一般情况下,您将无法确定发生了什么。Akira,驱动程序本身没有,但这可以从调用DriverManager.getConnection()时引发的异常中扣除,即对于oracle,您将获得错误的凭据,从而导致错误。我按照@rkosegi在他的评论中的建议做了。当然,C3P0可能会掩盖一些事情,但打开与数据库的新连接也会带来后果。连接池的存在是有原因的。您可能会创建太多到数据库的连接,然后这些连接开始出现问题。看起来您不想要应用程序服务器提供的连接池,而是想要创建自己的结构。我从来没有说过我在任何类型的服务器上运行我的应用程序。创建专用连接只是为了测试凭据而没有连接池。@rkosegi确实是这样做的。请把你的评论作为答案,这样我就可以接受了。只是作为答案发布。如果对你有帮助,我很高兴