想来笔者作为一名java新手,不是什么大牛,没有过人的编程天赋,只是一名普普通通的程序员,基础也不是很扎实,但是有一颗成为大牛的心,不断总结才会有进步,在成长的路上留下自己的轨迹。
读写分离,就是两台数据库,一台做插入,另一台做查询,数据库之间数据如何同步,笔者能力有限,只能是简单的读写分离,普通的做法是定义多个数据源,利用hibernateTemplate或者是jdbcTemplate实现查询或者插入。利用spring提供的DriverManagerDataSource方法也能简单的实现。
定义父数据源parentDataSource
<bean id="parentDatasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
定义主库和备库
<!--主库-->
<bean id="masterDataSource" parent="parentDatasource">
<property name="url" value="jdbc:mysql://localhost:3306/mysql_master"/>
</bean>
<!--从库-->
<bean id="slaveDataSource" parent="parentDatasource">
<property name="url" value="jdbc:mysql://localhost:3306/mysql_slave"/>
</bean>
定义CustomerRoutingDataSource,根据不同的key得到不同的数据源
<bean id="dataSource" class="com.mall.dao.good.CustomerRoutingDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="master" value-ref="masterDataSource"></entry>
<entry key="slave" value-ref="slaveDataSource"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="masterDataSource"></property>
</bean>
CustomerRoutingDataSource.java
public class CustomerRoutingDataSource extends AbstractRoutingDataSource {
protected Object determineCurrentLookupKey() {
return CustomerContextHander.getCustomerType();
}
}
CustomerContextHander.hava
public class CustomerContextHander {
private static final ThreadLocal<String> contextHander=new ThreadLocal<String>();//线程安全
public static void setCustomerType(String customerType){
contextHander.set(customerType);
}
public static String getCustomerType(){
return contextHander.get();
}
public static void clearCustomerType(){
contextHander.remove();
}
}
注入jdbcTemplate中,利用jdbcTemplate实现插入和查询
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
测试 TestMaster.java
public class TestMaster {
public static void main(String[] args){
ApplicationContext ctx= new ClassPathXmlApplicationContext(new String[]{"/spring/applicationContext.xml"});//启动spring容器
UserDao userDao = (UserDao)ctx.getBean("userDaoImpl");//获取userDaoImpl
CustomerContextHander.setCustomerType("slave");//设置需要操作的数据库
List<Users> users=userDao.getListAll();
for(Users user:users){
System.out.println(user.getUsername());
}
}
}
简单的读写分离就实现了,笔者也是参考了别人的文章,自己动手实现,数据库中数据如何同步不知道如何实现,在以后的日子中慢慢探索吧,慢慢见证自己的成长之路,也希望大家都能不断提高,不断总结,成为大牛,借用自己非常喜欢的一句话,生活的每一天都是挑战,自己离成功还很远。