当前位置: 首页 > 知识库问答 >
问题:

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

桓喜
2023-03-14

我想在Spring MyBatis项目中动态更改数据源属性。

问题是在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。请帮我解决这个问题。

共有3个答案

长孙明知
2023-03-14
UserCredentialsDataSourceAdapter ds = (UserCredentialsDataSourceAdapter) applicationContext.getBean("dataSource");
ds.removeCredentialsFromCurrentThread();
ds.setCredentialsForCurrentThread("test", "test");
ds.setUsername("test");
ds.setPassword("test");
ds.setTargetDataSource(ds);
ds.afterPropertiesSet();

authDao。getDetails()//这将调用接口并执行xml文件中的查询

袁志专
2023-03-14
<bean id="targetDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${app.jdbc.driverClassName}" />
    <property name="url" value="${app.jdbc.url}" />
</bean>

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

<!-- Declare a transaction manager for Encounter Navigator Authenticator -->
<!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- define the SqlSessionFactory for Encounter Navigator Authenticator, 
    notice that configLocation is not needed when you use MapperFactoryBean -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
    name="sqlSessionFactory">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations"
        value="file:C:/Program Files/Apache Software Foundation/Tomcat 7.0/config/app_user/*.xml" />
    <property name="configLocation" value="classpath:sqlmap-config.xml" />
</bean>

<!-- scan for MAPPERS and let them be auto-wired - For Encounter Navigator 
    Authenticator -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage"
        value="com.upmc.health.encounternavigator.dao.authentication" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
商昂然
2023-03-14

我想你用的是mybatis spring。

由于您使用的是连接池,因此使用UserCreentalsDataSourceAdapter的方法不起作用,因此连接在使用后不会关闭,但会返回到池中并在以后重用,即使您已更改用户名和密码。要解决此问题,只需摆脱池:

<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使用配置的数据源。这可以通过在JNDI中注册数据源并配置mybatis从JNDI获取数据源来实现。

 类似资料:
  • 问题内容: 我有一个Spring应用程序,我想动态更改数据源。当输入DS URL时,Spring Bean和所有依赖项将自动更新。我知道这有些奇怪,但是无论如何我都想实现。我的Spring配置如下: 问题是: JDBC URL存储在属性中,可以在运行时更改它。 更改URL后,我需要重新创建数据源,可能还需要重新创建相关对象。我不知道Spring如何优雅地做呢? 我知道Spring确实可以基于一个键

  • 我有一个Spring应用程序,我想动态更改数据源,即。当输入DS URL时,Spring bean和所有依赖项将自动更新。我知道这有点奇怪,但无论如何我想实现这一点。我的Spring配置如下: 问题是: > 一旦URL被更改,我需要重新创建数据源,可能还有依赖对象。我不知道如何在Spring优雅地做这件事? 我知道Spring可以基于一个键动态路由数据源,但数据源URL是在Spring中预定义的,

  • 如何动态设置数据源?像下面的Spring: 我可以从Spring导入这个功能到Java的EE 7企业应用程序吗?

  • 我正在用Grails构建一个多租户应用程序,我想保持独立的数据库。我需要在运行时动态更改url以将GORM指向不同的数据库。 我有一个前端充当平衡器,将请求分发到后端主机集群。每个后端主机运行一个Grails 2.3.5实例和一个带有多个数据库的mysql服务器(每个租户一个)。我希望动态更改数据源,以便GORM可以访问正确数据库上的域实体。 有什么想法吗? 谢啦

  • 在我的笔记本电脑安装Weblogic 11g时,在服务器运行时更改网络(WIFI到有线等)似乎会中断数据源连接。我必须重新启动(这需要很长时间)才能让我在Weblogic上运行的应用程序再次工作。我试图查看控制台中的数据源连接设置以禁用“此”监控。但是找不到关闭它的方法。 想知道是否有办法关掉这种奇怪的行为。

  • 我正在开发一个web应用程序,使用React跟踪水果供应商的库存。js,MongoDB,Node。js和Express。我调用了数据库endpoint来呈现表中的数据。现在,我尝试使用按钮增加和减少库存量,但当我尝试设置新状态时,它不起作用。我尝试通过单击更改状态,然后更新数据库中的新状态。有什么建议吗? > 可结果成分: 从'react'导入Reac,{Component};从“react bo