之前发布了mysql主从配置的博客,配置完成之后,那么我们肯定要拿主从来做点什么。

我第一想到的就是mysql的读写分离,让读写分离之后可以大大的提供mysql的性能,比单纯用mysql主从做备份好很多。

网上找了很多,但是配置确实差别不大,实现的方式也大同小异,但是需要指出的是,如果你和我一样使用的是mybatis的话需要注意一些问题。

首先配置数据源

<!-- 配置dbcp数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://192.168.75.128:3306/xxxxxx" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean> <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://192.168.75.130:3306/xxxxxx" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean> <bean id="dynamicDataSource" class="util.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry value-ref="dataSource" key="dataSource"></entry>
<entry value-ref="dataSource2" key="dataSource2"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource" >
</property>
</bean>

然后是配置DynamicDataSource

package util;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource{

    @Override
protected Object determineCurrentLookupKey() {
return CustomerContextHolder.getCustomerType();
} }

然后配置CustomerContextHolder

package util;

public class CustomerContextHolder {
public static final String DATA_SOURCE_A = "dataSource";
public static final String DATA_SOURCE_B = "dataSource2";
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
return contextHolder.get();
}
public static void clearCustomerType() {
contextHolder.remove();
}
}

最后使用

CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_A);和CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);

改变数据源在dao实现层

主要参考的是这个网址

http://blog.csdn.net/alaahong/article/details/8707915

结果发现不对,你会发现不管你怎么设置数据源,都永远只是访问了一个默认的,而没有访问另一个,为什么呢?

后来我发现,原来是使用mybatis的关系

mybatis首先有一个工厂

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />

</bean>

这个工厂需要配置固定的数据源

然后这个工厂会产出sqlSessionTemplate

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">

<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />

</bean>

而我们的dao实现层就是利用sqlSessionTemplate去执行的sql语句,然后我们的sqlSessionTemplate至始至终都没有改变过,所以永远使用的是同一个数据源。

依据这个情况我做了一些修改

<!-- 配置mybitasSqlSessionFactoryBean -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

</bean>

<!-- 配置SqlSessionTemplate -->

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">

<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />

</bean>

<!-- 配置mybitasSqlSessionFactoryBean2 -->

<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource2" />

</bean>

<!-- 配置SqlSessionTemplate2 -->

<bean id="sqlSessionTemplate2" class="org.mybatis.spring.SqlSessionTemplate">

<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory2" />

</bean>

配置了两个工厂,拥有不同的数据源。

然后在dao的实现层注解了两个不同的工厂

@Resource(name = "sqlSessionTemplate")

    private SqlSessionTemplate sqlSessionTemplate;

@Resource(name = "sqlSessionTemplate2")

    private SqlSessionTemplate sqlSessionTemplate2;

然后使用两个不同的工厂去调用读取和修改。

然后就成功了。

但是实际的项目中,如果你真的这么做,那么对于程序员来说很痛苦。

他们必须在每个dao的实现层有这么两个对象。

然后对于查询调用哪一个,然后对于修改调用那一个必须很清楚,不能出错。

这样来说之前那个dynamicDataSource配置就没有什么用了。

主要就是靠mybatis的两个工厂实现了读写的分离。

所以对于这个问题,我还要寻找更好的解决方案。

最新文章

  1. 学习篇:TypeCodes的2015年博客升级记
  2. 解决VS2015启动时Package manager console崩溃的问题 - Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope
  3. HTML5获取地理位置
  4. C C++ TDD单元测试非常好的书
  5. @OBJC 和 DYNAMIC
  6. linux u-boot跟踪方法总结
  7. HDU 3746:Cyclic Nacklace
  8. poj 2192 (DP)
  9. 启动PL/SQL Developer 报字符编码不一致错误 Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character set conversion may cause unexpected results. Note: you can set the client
  10. POJ 1077 HDU 1043 Eight (IDA*)
  11. Hibernate JPA 中配置Ehcache二级缓存
  12. C++构造函数(一)
  13. Scala入门系列(十三):类型参数
  14. Git详解之二:Git基础
  15. 【题解】Luogu P2347 砝码称重
  16. 21、bootstrap框架
  17. 目标检测网络之 Mask R-CNN
  18. Centos 6.5初始化配置
  19. 启动studio报错Gradle error
  20. 如何使用 Java 删除 ArrayList 中的重复元素

热门文章

  1. 得分(Score, ACM/ICPC Seoul 2005,UVa 1585)
  2. JPA 系列教程 异常 集锦
  3. linux权限解读
  4. JavaScript中prompt()函数的用法。
  5. JAVA的字符编码及问题
  6. ZOJ 1926 Guessing Game
  7. Yii CDBCriteria常用方法
  8. 浙大 pat 1024题解
  9. 深入浅出聊Unity3D项目优化:从Draw Calls到GC
  10. openwrt 的 inittab