本文共 2719 字,大约阅读时间需要 9 分钟。
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)
org.hibernate.dialect.Oracle10gDialect true auto true false org.hibernate.cache.EhCacheProvider false
使用Hibernate时的事务管理配置示例:
< property name="sessionFactory" ref="sessionFactory" /> bean>
6.动态数据源的管理控制
1.可以根据不同的DAO注入目标sessionfactory
2.可以采用代码手动控制
DBContextHolder.setCustomerType(DBContextHolder.masterDataSource);DBContextHolder.setCustomerType(DBContextHolder.slaveDataSource);
3.可以采用AOP的控制方式
1 2 3 4 5 6 7 8 9 10 11 12 13 | @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属性配置就好。
转载地址:http://epgzl.baihongyu.com/