jfinal 实现读写分离啊?

有重新引入个插件还是现有的DbPro改造啊

评论区

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 谢谢啊.

热门反馈

扫码入社