设为首页 加入收藏

TOP

Spring多数据源的配置
2015-08-31 21:24:16 来源: 作者: 【 】 浏览:31
Tags:Spring 数据源 配置

C3P0和DBCP的区别


C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。?


dbcp简介:?


DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。?


c3p0与dbcp区别:?


dbcp没有自动的去回收空闲连接的功能? c3p0有自动回收空闲连接功能?


两者主要是对数据连接的处理方式不同!C3P0提供最大空闲时间,DBCP提供最大连接数。


前者当连接超过最大空闲连接时间时,当前连接就会被断掉。DBCP当连接数超过最大连接数时,所有连接都会被断开


1、首先配置多个datasource


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.动态数据源的管理控制


?1.可以根据不同的DAO注入目标sessionfactory


class="cn.com.dao.impl.demoDaoImpl">


class="cn.com.dao.impl.demoDao1Impl">


?2.可以采用代码手动控制


DBContextHolder.setCustomerType(DBContextHolder.masterDataSource);
DBContextHolder.setCustomerType(DBContextHolder.slaveDataSource);


3.可以采用AOP的控制方式


@Aspect?


?public class DynamicDataSourceAspect {?


? ? @Pointcut("execution (public service.impl..*.*(..))")?


? ? public void serviceExecution(){}?


? ? ? ?


? ? @Before("serviceExecution()")?


? ? public void setDynamicDataSource(JoinPoint jp) {?


? ? ? ? for(Object o : jp.getArgs()) {?


? ? ? ? ? ? //处理具体的逻辑 ,根据具体的境况


? ? ? ? ? ? ? DBContextHolder.setCustomerType()选取DataSource?


? ? ? ? }?


? ? }?


?}? ? ?


7.总结


? 通过扩展Spring的AbstractRoutingDataSource可以很好的实现多数据源的rout效果,而且对扩展更多的数据源有良好的伸缩 性,只要增加数据源和修改DynamicDataSource的targetDataSources属性配置就好。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java重写hashcode方法 下一篇Java重写equals方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: