spring多数据源的配置(转)

简介: C3P0和DBCP的区别   C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,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

 

复制代码
    <!-- 主数据库的数据据源 -->
    <bean id="masterDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@192.168.10.11:1521:trew" /> <property name="username" value="poi" /> <property name="password" value="poi" /> </bean> <!-- 备份库的数据据源 --> <bean id="slaveDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@192.168.10.12:1521:trew" /> <property name="username" value="poi2" /> <property name="password" value="poi2" /> </bean>
复制代码

 

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. 配置动态数据源

 

复制代码
 <!--将DynamicDataSource Bean加入到Spring的上下文xml配置文件中去,同时配置DynamicDataSource的targetDataSources(多数据源目标)属性的Map映射。-->

    <bean id="dataSource" class="cn.com.core.datasource.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry key="masterDataSource" value-ref="masterDataSource" /> <entry key="slaveDataSource" value-ref="slaveDataSource" /> </map> </property> <property name="defaultTargetDataSource" ref="masterDataSource"/> </bean>
复制代码

 

4.使用动态数据源(hibernate)

 

复制代码
<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="lobHandler" ref="lobHandler"/> <property name="eventListeners"> <map> <entry key="post-insert"> <ref bean="logListener"/> </entry> <entry key="post-update"> <ref bean="logListener"/> </entry> <entry key="post-delete"> <ref bean="logListener"/> </entry> </map> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle10gDialect <!-- org.hibernate.dialect.OracleDerbyDialect --> </prop> <prop key="hibernate.show_sql">true</prop> <!-- <prop key="hibernate.generate_statistics">true</prop> --> <prop key="hibernate.connection.release_mode"> auto </prop> <prop key="hibernate.autoReconnect">true</prop> <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> <prop key="hibernate.cache.use_second_level_cache">false</prop> <prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </prop> <prop key="hibernate.cache.use_query_cache">false</prop> </props> </property> </bean>
复制代码

 

 

 

 

使用Hibernate时的事务管理配置示例:

 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">   < property name="sessionFactory" ref="sessionFactory" />   bean> 

 

6.动态数据源的管理控制

 

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

复制代码
<bean id="demoDao"
class="cn.com.dao.impl.demoDaoImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="demoDao1" class="cn.com.dao.impl.demoDao1Impl"> <property name="sessionFactory" ref="sessionFactory1"/> </bean>
复制代码

 

 

 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://www.cnblogs.com/xiaoblog/p/4720160.html

 

 

相关文章
|
2月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
2月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
2月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
4月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
952 0
|
1月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
532 5
|
2月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
179 0
探索Spring Boot的@Conditional注解的上下文配置
|
7月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
898 2
|
8月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
1010 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
9月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
641 26

热门文章

最新文章

下一篇
oss云网关配置