首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
jfinal 实现读写分离啊?
小风
2019-05-19 16:22
有重新引入个插件还是现有的DbPro改造啊
项目:
JFinal
1
评论区
JFinal
2019-05-19 17:10
最简单是通过直接配置 mysql 为读写分离,做主从配置,主库可读写,从库只读。这种方案对于你的代码来说是透明的,是最省事的
再一个就是直接使用第三方中间件,类似于 shareding jdbc、mycat 之类的,同样也是对你的代码透明化,代码完全不需要知道这件事
如果你非要自己写代码解决,做个全局拦截器,参考 Tx.java,事先往 Config 中的 ThreadLocal 中放入 Connection 对象,后续一切数据库操作都会使用这个 Connection,从而实现读写分离
全局拦截器大致为:
String methodName = nv.getMethodName();
Connection conn;
// 根据 methodName 判断出是写库操作
if (isWriteDb(methodName)) {
conn = DbKit.getConfig("写库数据源对应的 configName").getDataSource().getConnection();
} else { // 读库操作
conn = DbKit.getConfig("读库数据源对应的 configName").getDataSource().getConnection();
}
// 设置到 ThreadLocal 中去,当前线程后续的所有数据库操作都将用到这个 conn
DbKit.getConfig().setThreadLocalConnection(conn);
try {
inv.invoke();
}finally {
DbKit.getConfig().removeThreadLocalConnection();
}
注意,使用上面的方法以后,后面的数据库操作就不要再使用 Db.use(...)、model.use(...) 方法了,否则将覆盖掉上面拦截器的努力
@海哥
的 jpress 或 jboot 项目就是通过拦截器实现的读写分离,可以参考一下
回复
小风
2019-05-23 10:20
@JFinal
谢谢啊.
回复
发送
我要反馈
热门反馈
扫码入社
再一个就是直接使用第三方中间件,类似于 shareding jdbc、mycat 之类的,同样也是对你的代码透明化,代码完全不需要知道这件事
如果你非要自己写代码解决,做个全局拦截器,参考 Tx.java,事先往 Config 中的 ThreadLocal 中放入 Connection 对象,后续一切数据库操作都会使用这个 Connection,从而实现读写分离
全局拦截器大致为:
String methodName = nv.getMethodName();
Connection conn;
// 根据 methodName 判断出是写库操作
if (isWriteDb(methodName)) {
conn = DbKit.getConfig("写库数据源对应的 configName").getDataSource().getConnection();
} else { // 读库操作
conn = DbKit.getConfig("读库数据源对应的 configName").getDataSource().getConnection();
}
// 设置到 ThreadLocal 中去,当前线程后续的所有数据库操作都将用到这个 conn
DbKit.getConfig().setThreadLocalConnection(conn);
try {
inv.invoke();
}finally {
DbKit.getConfig().removeThreadLocalConnection();
}
注意,使用上面的方法以后,后面的数据库操作就不要再使用 Db.use(...)、model.use(...) 方法了,否则将覆盖掉上面拦截器的努力
@海哥 的 jpress 或 jboot 项目就是通过拦截器实现的读写分离,可以参考一下