spring多数据源配置
2016-03-29 10:34
561 查看
前段时间由于公司项目需求,需要多数据源的支持,苦b折腾了两天程序猿,话不多说,直接撸码。
application-context.xml配置:
创建一个动态数据源类:
再创建一个数据源管理控制类:
写到这里,配置基本完毕了,接下来就可以读取不同的数据源,来进行持久化操作了:
我dao层封装方法:
上面就是spring多数据源的全部代码,写的不好的地方,技术大神请指出。
application-context.xml配置:
<!-- 引入jdbc配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- 配置数据源 one--> <bean id="dataSourceone" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}"> </property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.user}"></property> <property name="password" value="${jdbc.pass}"></property> <!--initialSize: 初始化连接 --> <property name="initialSize" value="5" /> <!--maxIdle: 最大空闲连接 --> <property name="maxIdle" value="10" /> <property name="minIdle" value="5" /> <property name="maxActive" value="15" /> <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="180" /> <!-- maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> <property name="maxWait" value="3000" /> <property name="validationQuery"> <value>SELECT 1</value> </property> <property name="testOnBorrow"> <value>true</value> </property> </bean> <!-- 配置数据源 two--> <bean id="dataSourcetwo" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver1}"> </property> <property name="url" value="${jdbc.url1}"></property> <property name="username" value="${jdbc.user1}"></property> <property name="password" value="${jdbc.pass1}"></property> <!--initialSize: 初始化连接 --> <property name="initialSize" value="5" /> <!--maxIdle: 最大空闲连接 --> <property name="maxIdle" value="10" /> <property name="minIdle" value="5" /> <property name="maxActive" value="15" /> <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="180" /> <!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> <property name="maxWait" value="3000" /> <property name="validationQuery"> <value>SELECT 1</value> </property> <property name="testOnBorrow"> <value>true</value> </property> </bean> <!-- 通过key-value的形式来关联数据源 --> <bean id="dynamicDataSource" class="com.jeekup.rp.util.DynamicDataSource" > <property name="targetDataSources"> <map> <entry value-ref="dataSourcethree" key="dataSourcethree"></entry> <entry value-ref="dataSourceone" key="dataSourceone"></entry> <entry value-ref="dataSourcetwo" key="dataSourcetwo"></entry> </map> </property>
<!--默认当前的数据源 --> <property name="defaultTargetDataSource" ref="dataSourceone" /> </bean> <!-- JdbcTemplate使用动态数据源的配置管理 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dynamicDataSource" /> </property> </bean> <!-- 配置sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <!-- 读取数据源 --> <property name="dataSource" ref="dynamicDataSource" /> <!-- 找到实体类的对象 --> <property name="packagesToScan" value="com.jeekup.rp.model" /> <!-- 数据库规则 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.format_sql">true</prop> </props> </property> </bean> <!-- 配置sessionFactory事物 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <!-- 注入BaseDao --> <bean id="BaseDaoimp" class="com.base.imp.BaseDaoimp"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <!-- 配置事务的传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="execute*" propagation="REQUIRED" /> <tx:method name="get*" read-only="true"/> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice>
创建一个动态数据源类:
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource{ @Override protected Object determineCurrentLookupKey() { return DBContextHolder.getDBType(); } }
再创建一个数据源管理控制类:
public class DBContext{ public static final String DATA_one = "dataSourceone"; public static final String DATA_tow = "dataSourcetwo"; private static final ThreadLocal<String> context = new ThreadLocal<String>(); public static void setDBType(String dbType) { context.set(dbType); } public static String getDBType() { return context.get(); } public static void clearDBType() { contextHolder.remove(); } }
写到这里,配置基本完毕了,接下来就可以读取不同的数据源,来进行持久化操作了:
@Service public class adminService{ @Autowired private BaseDao dao; public List<admin> get_admin() { DBContext.setDBType(DBContext.DATA_one);//这里就可以用来切换了! return (List<admin>) dao.findByHql("from admin",new Object[]{}); }
我dao层封装方法:
public List<?> findByHql(String hql, Object[] obj) { return getHibernateTemplate().find(hql, obj); }
上面就是spring多数据源的全部代码,写的不好的地方,技术大神请指出。
相关文章推荐
- JAVA 学习之标识符
- java中接口抽象类的标准案例
- java中foreach的使用格式
- Hibernate 集合属性的操作
- Eclipse配置(Mac版)
- java中Comparable接口(比较器)的使用
- java15天
- java使用poi操作Excel
- 安装JDK提示: 该项不适于在指定状态下使用的错误
- java 求数字在排序数组中出现的次数(O(logn))
- javaweb入门
- java基础知识汇总6(html篇)
- eclipse中使用git进行版本控制
- Java随机数
- java 读取文件
- java基础知识总结5
- Java学习笔记(十六):UML类图符号以及各种关系
- Java中hashCode的作用
- java基础知识汇总4
- 通过web.xml启动spring容器遇到classnotfound解决方法