spring - 动态(运行时)更改 Spring Mybatis 中的数据源凭据

标签 spring jdbc datasource mybatis

我想动态改变Spring+MyBatis项目中的Datasource属性。

问题出在 Spring + MyBatis 集成中,我们无法在运行时动态设置数据源属性。

目前我正在使用以下代码来设置凭据:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.url}" p:username="${jdbc.username}"
    p:password="${jdbc.password}" />

我尝试使用 UserCredentialsDataSourceAdapter 的选项在运行时更改密码,但我无法返回数据源对象以作为 MyBatis 用于连接

ApplicationContext context = ApplicationContextUtils.getApplicationContext();
UserCredentialsDataSourceAdapter ds = (UserCredentialsDataSourceAdapter) context.getBean("dataSource");
ds.setCredentialsForCurrentThread("test", "test");

我卡在这里了,我不能使用数据源元素 ds 来为 MyBatis 建立连接。请帮我解决这个问题。

最佳答案

我想你使用 mybatis-spring .

您使用 UserCredentialsDataSourceAdapter 的方法无效,因为您使用的是连接池,因此连接在使用后不会关闭,但会返回到池中并在以后重新使用,即使您更改了用户名和密码也是如此。 要解决此问题,只需摆脱池:

<bean id="targetDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter">
  <property name="targetDataSource" ref="targetDataSource"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

并在 SqlSessionFactoryBean 配置中使用后面的 bean:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>

如果不使用mybatis-spring,直接使用mybatis那么问题就是让mybatis使用配置好的DataSource。这可以通过 registering 来完成JNDI 和 configure mybatis 中的数据源从 JNDI 获取数据源。

关于spring - 动态(运行时)更改 Spring Mybatis 中的数据源凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21639235/

相关文章:

getConnection() 上的 java.util.NoSuchElementException

mysql - 找不到 mysql.jdbc.Driver - MySQL、JBoss

mysql - 在docker容器中运行时,Scala Play JDBC无法连接到MySQL

java - 如何在 Hive JDBC 中禁用详细日志记录

java - 如何在 Tomcat 6 中配置全局 JNDI 数据源?

c# - ASP.NET LinqDataSource WHERE 子句

java - Spring Controller 中的圆形 View

java - 使用 Spring 在 Jquery 中上传图像?

java - API方法可以返回不同的类型,我如何定义返回类型?

Spring SpEL 选择了错误的方法来调用