博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring多数据源的配置(转)
阅读量:6825 次
发布时间:2019-06-26

本文共 2719 字,大约阅读时间需要 9 分钟。

 

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)

 

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.总结

 

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

 

 

转载地址:http://epgzl.baihongyu.com/

你可能感兴趣的文章
SQL与NoSQL数据库入门基础知识详解
查看>>
Redis命令——键(key)
查看>>
[Server] 服务器配置SSH登录邮件通知
查看>>
ceph 添加新硬盘删除旧的OSD
查看>>
Kubernetes 的安全机制 APIServer 认证、授权、准入控制
查看>>
杨老师课堂之Nginx学习之反向代理
查看>>
阿里云GPU云服务器
查看>>
自定义Dialog之旅程(二)理解Dialog大小
查看>>
最伟大的程序员高德纳: 谈计算机程序设计艺术
查看>>
利用Xamaria构建Android应用-公交发车信息屏
查看>>
Android自定义注解(一)
查看>>
Java并发编程-AQS
查看>>
修复网站漏洞对phpmyadmin防止被入侵提权的解决办法
查看>>
Android Studio 中无法下载com.android.tools.build:gradle:3.0.1
查看>>
@程序员,拒绝无聊的代码面试!
查看>>
学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
查看>>
媒体处理 MTS-基础问题
查看>>
在Centos 7上安装Docker
查看>>
c# 守护进程,WPF程序自守护
查看>>
Android permission 动态申请、授权
查看>>