如何在spring配置多个数据源 springboot如何配置多个jndi数据源
如何在spring配置多个数据源
给你一个例子:
context.xml
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
package util
public class DbContextHolder {
private static final ThreadLocal contextHolder = new ThreadLocal()
public static void setDbType(String dbType) {
contextHolder.set(dbType)
}
public static String getDbType() {
return (String) contextHolder.get()
}
public static void clearDbType() {
contextHolder.remove()
}
}
package util
import java.sql.SQLException
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
public class DynamicDataSource extends AbstractRoutingDataSource {
//static Logger log = Logger.getLogger("DynamicDataSource")
@Override
protected Object determineCurrentLookupKey() {
// TODO
return DbContextHolder.getDbType()
}
@Override
public boolean isWrapperFor(Class> iface) throws SQLException {
// TODO Auto-generated method stub
return false
}
@Override
public
// TODO Auto-generated method stub
return null
}
}
测试程序:
DbContextHolder.setDbType("1")
UserDomain od = this.testService.queryUserAccount("admin")
System.out.println("username==" od.getName())
DbContextHolder.setDbType("0")
d = this.testService.queryUserAccount("admin")
springboot如何配置多个jndi数据源
代码:
/**
* 获取数据库连接方法
*/
public Connection getConn() throws
Exception {
Connection conn = null
try {
//connection原始的连接方式可以转换为OracleConnection
Connection con =
this.commonDao.getCurrentConnection()
Connection conWas = null
if(this.wasConnection){//使用tomcat请把biz-context-finance.xml中的wasConnection的值设置为false
注释掉biz-context-core.xml中的id="websphereForOracleConnection"内容
WebSphereNativeJdbcExtractor websphereForOracleConnection =
(WebSphereNativeJdbcExtractor)SpringUtils.getSpringBean("websphereForOracleConnection")
conWas = websphereForOracleConnection.getNativeConnection(con)
}else{
conWas = con
}
conWas.setAutoCommit(false)
conn =
conWas.getMetaData().getConnection()
} catch (DaoException e) {
e.printStackTrace()
}
return conn
}
spring c3p0多数据源怎么配置
首先配置多个datasource
destroy-method="close">
destroy-method="close">
2、写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法
public class DynamicDataSource extends AbstractRoutingDataSource {
@SuppressWarnings("unused")
private Log logger = LogFactory.getLog(getClass())
@Override
protected Object determineCurrentLookupKey() {
return DbContextHolder.getDbType()
}
}
public class DbContextHolder {
@SuppressWarnings("rawtypes")
private static final ThreadLocal contextHolder = new ThreadLocal()
@SuppressWarnings("unchecked")
public static void setDbType(String dbType) {
contextHolder.set(dbType)
}
public static String getDbType() {
return (String) contextHolder.get()
}
public static void clearDbType() {
contextHolder.remove()
}
}
3. 配置动态数据源
4.使用动态数据源(hibernate)
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> org.hibernate.dialect.Oracle10gDialect true auto true false org.hibernate.cache.EhCacheProvider false
使用Hibernate时的事务管理配置示例:
< property name="sessionFactory" ref="sessionFactory" /> bean> 6.动态数据源的管理控制
如何在一个Spring工程下使用多数据源配置的改进实现
笔者在实际应用中遇到需要在一个项目工程里,通过不同的DAO操作不同的数据库下的某个数据表,原来使用的方法是,在Spring的配置文件applicationContext.xml里配置两个dataSource,然后配置两个abstractSessionFactory对应这两个dataSource,再配置两个sessionFactory对应这两个abstractSessionFactory,接着配置两个transactionManager管理这两个sessionFactory,总之就是工程需要连接几个数据库,所有关于数据源的配置就得对应配置几套。
当然还需要记着在web.xml里为每个sessionFactory配置对应的openSessionInViewFilter
然后在程序中,通过将对某个数据库操作的DAO统一继承某个基础DAO类,此DAO继承org.springframework.orm.hibernate3.support.HibernateDaoSupport,实现如下方法,参数是
SessionFactory,通过@Resource注解,把某个数据库对应的SessionFactory对象,注入到这个方法中来,然后再这个方法中调
用父类HibernateDaoSupport中的setSessionFactory(SessionFactory
sessionFactory)方法把sessionFactory对象传递进去(不重写是因为HibernateDaoSupport的这个方法是final的)。
其实Spring本身提供了动态数据源的抽象实现类org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSourc
e,你需要做的就是依据自己的应用去实现具体的方法。
以本文最初的需求为例,我们来看看通过继承AbstractRoutingDataSourc
首先创建一个枚举类,设置不同的dataSource类别。
接下来创建一个类,来在Context里设置和持有数据源类型,在这个需求里,并发的不同的DAO调用,会根据DAO的不同连接不同的数据库,因此我们通过ThreadLocal来维护这个DataSourceType变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
最后就是实现定制的继承AbstractRoutingDataSource的实现类
接下来就是在applicationContext.xml里配置这么一个数据源来管理两个dataSource。
先配置两个独立的dataSource
然后配置一个dataSource来管理这两个dataSource
其余部分都和正常的配置一个数据源管理无异,完成了配置后,改写我们的基础DAO
这样就完成了多数据源的配置,大家可以按照这个思路稍加变动,应该就可以找出实现动态切换数据源的办法了。
spring 中怎么配置数据源的
第一步 引入jar包,例如c3p0.jar
第二步 将jarbuildpath引入类中
第三步 在spring的配置文件中配置
例如:
〈bean id=datasource class=com.mchange...〉
配置连接信息(手机写太累了) 配置好之后可以弄一个测试累, 弄一个 applicationContext ctx=new classpathxmlapplicationcontext(xxx.xml) datasource ds = ctx.getbeans(datasource) sysout(ds)如果输出了结果,就表明连接成功了
如何在spring框架中解决多数据源的问题
我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。我们以往 在 spring 和 hibernate 框架中总是配置一个数据源在 我们的项目中遇到这样一个问题:如何让 sessionFactory 在执 行数据持久化的时候,更准确说是实例变量, sessionFactory 在整个项目中只有一 个对象.springframework,通过它来动态切换数据源 。同时在配置文件中将sessionFactory的dataSource属性由原来的某个具体的dataSource改为MultiDataSource,根据客户的需求能够动态切换不同的数据源,同时,我们又希望使用 dataSource 的 sessionFactory 根本就感觉不到这样的变 化。 Decorator 模式就正是解决这个问题的设计模式。
首先写一个 Decorator 类,我取名叫 MultiDataSource.commons。当我们使用 Decorator 的时候与原类完全一样,当 Decorator 的某些功能却已经修改为了我们需要修改的功 能。如图: