前段时间遇到多数据源动态切换问题,总结一下,做个记录,以备后续之需!
首先附上proxool连接池的配置方法:http://312350968.iteye.com/blog/1697508
proxool连接池是相对不叫稳定的第三方连接池,可以很好的跟spring结合,实现项目中动态切换数据源,大体的实现原理是继承AbstractRoutingDataSource类来实现动态切换.
具体代码如下:
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import com.mmc.util.LogUtil;
/**
* @author Wang Huifeng
*
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
/**
* 动态切换数据源
*/
@Override
protected Object determineCurrentLookupKey() {
Object key=DataSourceContextHolder. getDataSourceType();
if(key==null){
LogUtil.log("当前数据源是:"+DataSourceType.DB1);
}else{
LogUtil.log("当前数据源是:"+key);
}
return key;
}
}
/**
* @author Wang Huifeng
*
*/
public class DataSourceType {
public static final String DB1="db1";
public static final String DB2="db2";
}
/**
* @author Wang Huifeng
*
*/
@SuppressWarnings("unchecked")
public class DataSourceContextHolder {
private static final ThreadLocal contextHolder = new ThreadLocal();
public static void clearDataSourceType() {
contextHolder.remove();
}
public static String getDataSourceType() {
return (String) contextHolder.get();
}
public static void setDataSourceType(String dataSourceType) {
contextHolder.set(dataSourceType);
}
}
下面是是项目中如何调用以及spring配置文件中如何配置多数据源:
proxool的配置文件,目前该配置文件只有两个数据源
## proxool configuration
jdbc-0.proxool.alias=db1
jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-0.proxool.driver-url=jdbc\:mysql\://192.168.1.221\:3306/demo3?useUnicode\=true&characterEncoding\=utf-8
jdbc-0.user=root
jdbc-0.password=123456
jdbc-0.proxool.minimum-connection-count=25
jdbc-0.proxool.maximum-connection-count=100
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
jdbc-0.proxool.statistics=1m,15m,1d
jdbc-0.proxool.house-keeping-sleep-time=6000
jdbc-0.proxool.simultaneous-build-throttle=20
jdbc-0.proxool.prototype-count=3
jdbc-0.proxool.trace=true
## proxool configuration
jdbc-1.proxool.alias=db2
jdbc-1.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-1.proxool.driver-url=jdbc\:mysql\://192.168.1.221\:3306/demo2?useUnicode\=true&characterEncoding\=utf-8
jdbc-1.user=root
jdbc-1.password=123456
jdbc-1.proxool.minimum-connection-count=25
jdbc-1.proxool.maximum-connection-count=100
jdbc-1.proxool.house-keeping-test-sql=select CURRENT_DATE
jdbc-1.proxool.statistics=1m,15m,1d
jdbc-1.proxool.house-keeping-sleep-time=6000
jdbc-1.proxool.simultaneous-build-throttle=20
jdbc-1.proxool.prototype-count=3
jdbc-1.proxool.trace=true
该方法是如何切换数据源
DataSourceContextHolder.setDataSourceType(DataSourceType.DB1);
改段代码是如何在spring中配置多数据源:
<!-- Proxool 数据源 -->
<bean id="dataSource1"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.db1</value>
</property>
</bean>
<bean id="dataSource2"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.db2</value>
</property>
</bean>
<bean id="dataSource" class="com.mmc.dataSourceUtil.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="db1" value-ref="dataSource1" />
<entry key="db2" value-ref="dataSource2" />
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<!-- 扫描带注解的实体类 -->
<property name="packagesToScan">
<list>
<value>com.mmc.pojo</value>
</list>
</property>
<!-- 提供注解扫描类的设置 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<!--
<prop key="hibernate.show_sql">true</prop> <prop
key="hibernate.format_sql">true</prop>
-->
<prop key="hibernate.jdbc.batch_size">50</prop>
<prop key="hibernate.connection.autocommit">true</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
</props>
</property>
</bean>
分享到:
相关推荐
`Test.java`可能是实现动态数据源切换的Java代码。在代码中,通常会使用Spring框架的`DataSourceProxy`或者自定义的数据源切换逻辑来实现。例如,通过一个全局变量或配置文件来决定当前使用哪个数据源,然后在需要...
-- Proxool配置 --> ``` 3. **配置Hibernate**: 在Hibernate的配置文件(如`hibernate.cfg.xml`)中,将数据源设置为刚刚创建的Proxool数据源bean。比如: ```xml ... ... ...
整合proxool时,我们需要在web.xml中配置相关的servlet和参数,导入proxool的jar包,并在Spring配置文件中指定数据源的相关配置。 总的来说,Spring AOP提供了一种强大的工具,让我们能够更高效地管理横切关注点,...
通过`springwork.xml`配置文件,我们可以了解到Spring框架的基本用法和一些核心特性,如Bean的生命周期管理、属性配置、数据源管理等。此外,还介绍了如何利用Spring的配置机制来实现灵活的环境切换,这对于大型项目...
3. **dom4j.jar**:这是一个XML处理库,Hibernate依赖它来解析和生成XML配置文件,如Hibernate的映射文件(.hbm.xml),以及读写XML格式的数据。 4. **odmg.jar**:ODMG(Object-Database Mapping Group)提供了...
在企业级Java应用中,特别是在使用EJB(Enterprise JavaBeans)或Spring框架时,正确配置这些jar包以及选择合适的数据库连接池对于优化性能和实现高效的数据访问至关重要。开发者应根据项目需求和性能要求选择合适的...
这些是数据库连接池的实现,如C3P0和Proxool,它们提高了数据库连接的效率和管理,Hibernate支持通过配置文件选用这些连接池。 总结来说,Hibernate中的各个包共同协作,提供了一套完整的ORM解决方案。从对象的...
- **c3p0.jar**和**proxool.jar**:它们是数据库连接池实现,Hibernate可以配置使用这些连接池来提高性能和资源管理,但如果你已经有了其他的连接池解决方案,它们不是必需的。 总的来说,理解Hibernate的各个jar包...
CGLIB是一个强大的代码生成库,Hibernate使用它来创建动态代理类,这些类可以用来实现代理模式下的持久化对象操作。CGLIB在Hibernate中的使用非常重要,特别是在没有显式指定代理的情况下。 #### 3. dom4j.jar DOM4...
- **描述**:提供了一个抽象的日志记录接口,可以方便地切换不同的日志实现,如Log4j或JDK自带的日志系统。 - **作用**:统一了日志记录的方式,简化了日志配置。 - **重要性**:必须使用,因为它是日志记录的基础。...
- **作用**:为不同的日志实现提供了一个统一的接口,便于日志框架的切换。 #### 36. **standard-1.1.2.jar** - **用途**:通常指JSTL(JavaServer Pages Standard Tag Library)的实现。 - **作用**:提供了标准...