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属性配置就好。