Java 如何动态更改数据源使用的数据库密码,而spring事务管理器又使用该数据库密码

Java 如何动态更改数据源使用的数据库密码,而spring事务管理器又使用该数据库密码,java,spring,transactional,apache-commons-dbcp,Java,Spring,Transactional,Apache Commons Dbcp,在使用Spring事务管理器时,如何动态(在运行时)更改数据源使用的DB用户名和密码 我们使用Spring,有一个BasicDataSource和一个TransactionManager,定义如下,用于处理数据库连接和事务: <bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="url" ref="d

在使用Spring事务管理器时,如何动态(在运行时)更改数据源使用的DB用户名和密码

我们使用Spring,有一个BasicDataSource和一个TransactionManager,定义如下,用于处理数据库连接和事务:

<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="url" ref="dbUrl"/>
    <property name="username" ref="someUsername"/>
    <property name="password" ref="somePassword"/>
    <property name="driverClassName" value="org.postgresql.Driver" />
    ...
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
            p:dataSource-ref="myDataSource" />

<tx:annotation-driven transaction-manager="transactionManager" />

...
我们需要支持动态更改运行时使用的密码。请注意,我没有试图更改数据库中的密码;这已经发生在应用程序之外。我试图告诉我的应用程序切换它用来连接数据库的密码

我尝试扩展BasicDataSource并调用setUsername()和setPassword(),但更改用户名和密码似乎没有效果。通过查看BasicDataSource的实现,我可以看出用户名和密码似乎仅在最初构造连接池时使用

然后我找到了org.apache.commons.dbcp2.datasources.SharedPoolDataSource,并认为这就是我问题的答案。但看起来DataSourceTransactionManager采用了javax.sql.DataSource,但令人惊讶的是,SharedPoolDataSource并非如此

我找不到任何其他事务管理器会使用SharedPoolDataSource甚至javax.sql.ConnectionPoolDataSource


有没有办法使用事务管理器和连接池并动态更改所使用的DB密码?

您是在尝试更改与数据库连接的用户,还是在更改与数据库连接的用户的密码。在第二种情况下,DB用户应该具有更改密码的权限。这通常是通过管理数据库来完成的。我不确定这是允许的。@golyadkin我没有试图更改数据库中的密码;我只是想让我的数据源开始使用数据库中已经设置的新密码。我找不到任何方法获取BasicDataSource来更新它正在使用的密码,也找不到另一个支持密码更改的数据源。为什么需要动态执行此操作?一定是有人定期更改用户密码,但程序不知道何时设置新密码,也不知道何时调用您建议的代码来更改密码。此外,如何告知或提供密码?我建议您只需输入它。您需要创建一个fascade
数据源
,它允许您根据需要交换底层的
数据源。应该是相当简单的-主要考虑的是在漫游之前阻止工作并耗尽现有工作。我认为任何数据源都会在需要创建新连接时使用更新的登录名/密码,以扩展池或更新过时的连接。因此,如果您使用的数据源在每次使用之前更新过时的连接和/或测试它们,它会根据需要使用更新的用户/密码将绑定到旧用户/密码的旧连接替换为新连接。。。如果BasicDataSource不提供这两种功能,请尝试使用c3p0?