我目前正在解决一个问题,即我有一个正在运行的Java 6应用程序,首次启动时会创建一个BasicDataSource
,它在首次创建时会存储创建连接所需的所有必要信息。像这样的数据库:
DS.setUserName(username);
DS.setPassword(password);
DS.setUrl(url);
DS.setMinIdle(minIdle);
.
.
.
然后使用set属性创建与数据库的连接池。然后BasicDataSource
存储在Map
中,然后每次需要时都返回到调用方法,如下所示:
if (dataSources.contains(databaseDS)) {
return dataSources.get(databaseDS.getConnection());
}
我的理解是BasicDataSource
的连接池与数据库有实时连接,不需要使用密码登录数据库,而是连接已经有了与数据库建立的会话。这些连接将返回给调用方法,该方法不需要重新验证数据库。
但是,当更新数据库密码并且需要/生成新连接时,BasicDataSource
如何创建该连接?它是否尝试使用存储在BasicDataSource
中的密码对数据库进行身份验证以获取新连接?
谢谢
答案 0 :(得分:0)
所以最后,我最终决定同步从池中拉出连接。当我们没有连接并且BasicDataSource
需要再次为新连接进行身份验证时,我们将创建一个到数据库的新连接。但是,当密码更改后,我们会向数据库收到身份验证错误,然后我会从BasicDataSource
Map
中删除DataSource
。然后,我使用新密码创建一个新的BasicDataSource
。
同步的原因(如果这没有任何意义可以让某些人感觉到我?)是因为对数据库的失败认证只发生一次,所以我们不会试图打击数据库太多次密码错误。之前的连接将变得陈旧并最终被清理,然后对象应该被垃圾收集。