读写分离是依赖于主从复制,而主从复制又是为读写分离服务的。因为主从复制要求slave不能写只能读(如果对slave执行写操作,那么show slave status将会呈现Slave_SQL_Running=N0,此时你需要按照前面提到的手动同步一下slave
方案一
使用MySQL-proxy代理
优点:
直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号,MySQL官方不建议实际生产中使用
缺点:
降低性能,不支持事务
方案二
1、 使用 AbstractRoutingDataSource+aop+annotation 在 dao 层决定数据源
1,如果采用了 mybatis,可以将读写分离放在0RM层,比如mybatis可以通过mybatis plugin 拦截sql语句,所有的insert/update/delete都访问master库,所有的select都访问salve 库,这样对于dao层都是透明。plugin实现时可以通过注解或者分析语句是读写方法来选定主从库。不过这样依然有一个问题,也就是不支持事务,所以我们还需要重写一下 DataSourceTransactionManager,将read-only的事务扔进读库,其余的有读有写的扔进写库。
方案三
1、 使用 AbstractRoutingDataSource+aop+annotation 在 service 层决定数据源,可以支持事务.
2、 缺点:类内部方法通过this.xx()方式相互调用时,aop不会进行拦截,需进行特殊处理。
Was this helpful?
0 / 0