【问题标题】:How does the Java BasicDataSource create new connections to a database when the database password is changed?更改数据库密码后,Java BasicDataSource 如何创建与数据库的新连接?
【发布时间】:2018-01-12 14:29:36
【问题描述】:

我目前正在解决一个问题,即我有一个正在运行的 Java 6 应用程序,该应用程序在首次启动时会创建一个 BasicDataSource,它在首次创建时会存储创建与数据库的连接所需的所有必要信息,如下所示:

DS.setUserName(username);
DS.setPassword(password);
DS.setUrl(url);
DS.setMinIdle(minIdle);
.
.
.

然后它使用设置的属性创建一个到数据库的连接池。然后将BasicDataSource 存储在Map 中,然后在每次需要时将其返回给调用方法,如下所示:

if (dataSources.contains(databaseDS)) {
    return dataSources.get(databaseDS.getConnection());
}

我的理解是BasicDataSource 的连接池与数据库有实时连接,不需要使用密码登录数据库,而是该连接已经与数据库建立了会话。这些连接将返回给调用方法,不需要重新与数据库进行身份验证。

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

谢谢

【问题讨论】:

  • 您已将数据库凭据存储在某个地方并将它们传递给 BasicDataSource。如果数据库服务器端的凭据已更改,则需要在客户端应用程序中更改这些凭据。至少您必须使用新凭据重新启动您的应用程序。
  • @RobertMoskal 感谢您的快速回复。这是否意味着 BasicDataSource 在尝试生成与数据库的新连接时,将尝试发送旧密码并导致运行时异常,因为数据库将返回登录失败?
  • 我编辑了我的原始帖子并添加了更多细节。我之前忘了提到密码存储在BasicDataSource 对象本身中

标签: java database-connection datasource connection-pooling apache-commons-dbcp


【解决方案1】:

所以最后,我最终决定同步从池中拉取连接。当我们没有连接并且BasicDataSource 需要再次验证新连接时,我们将创建一个到数据库的新连接。但是,当密码更改时,我们会收到数据库的身份验证错误,然后我将从DataSources 的Map 中删除BasicDataSource。之后,我使用新密码创建一个新的BasicDataSource

同步的原因(如果这没有任何意义,有人可以给我一些意义吗?)是因为对数据库的身份验证失败只会发生一次,因此我们最终不会尝试使用密码错误。之前的连接会变得陈旧并最终被清理干净,然后对象应该被垃圾回收。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2015-10-08
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多