0

我目前正在研究一个运行Java 6应用程序的问题,当第一次启动时,会创建一个BasicDataSource,它在第一次创建时会存储创建到数据库的连接所需的所有必要信息,如下所示:当数据库密码更改时,Java 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的连接池具有对数据库不要活连接“ t要求使用密码登录到数据库,而是该连接已经建立了与数据库建立的会话。这些连接将返回到调用方法,不需要使用数据库重新进行身份验证。

但是,当数据库密码更新并且需要/产生新连接时,BasicDataSource如何创建该连接?它是否尝试使用存储在BasicDataSource中的密码进行数据库验证以获得新连接?

谢谢

+0

您已将数据库凭据存储在某处并将它们传递给BasicDataSource。如果数据库服务器端的凭证已更改,则需要更改客户端应用程序中的凭证。至少你必须用新的证书重新启动你的应用程序。 –

+0

@RobertMoskal感谢您的快速回复。这是否意味着BasicDataSource在尝试产生新的数据库连接时会尝试发送旧密码并导致运行时异常,因为数据库将返回登录失败? – Mark

+0

我编辑了我原来的帖子并添加了一些更多的细节。我之前忘记提到密码存储在'BasicDataSource'对象本身 – Mark

回答

0

所以最后,我最终决定从池中同步连接的拉动。当我们断开连接并且BasicDataSource需要再次验证新连接时,我们将创建到数据库的新连接。但是,当密码发生变化时,我们会向数据库收到验证错误,然后我会从中删除BasicDataSourceDataSource。之后,我用新密码创建一个新的BasicDataSource

原因同步(如果这是没有意义可能有人拍一些感觉入我?)是为了让没有身份验证数据库中只会发生一次,所以我们最终不会想太多次命中数据库密码错误。之前的连接会变得陈旧,最终会被清理干净,然后对象应该被垃圾收集。