2017-08-04 16:03
@dear7575 注意最新版本的 jfinal 的 Model 中有一个 protected Config _getConfig() 方法,这个方法是可以通过继承并覆盖,从而实现数据源切换的
简单来说,要在整上切换 model 的数据源,并且对开发者完全透明化,只需要做两点:
1:用一个全局拦截器 + ThreadLocal 将当前线程的 Config 绑定到当前线程
2:通过引入一个中间 MyModel extends Model 覆盖 _getConfig() 方法,并在这个方法中从全局拦截器中获取 ThreadLocal 中准备好的 Config 对象
而 Db.xxx(...) 系列方法的数据源自动化切换也大体可以用上面的方式,只需要将第 2 步改为以下的方式:
让 Db.xxx(...) 方法使用的 config 对象也参考上述方式进行切换
2017-08-04 14:39
@dear7575 使用一个全局拦截器,关注一下 DbKit.getConfig() 出来的 Config 对象中有一个 setThreadLocalConnection(Connection ) 方法
用这个方法可以直接为当前线程提供一个 connection,那么后续的数据库操作都会直拦支使用这个 connnection 对象了
更进一步,参考一下 com.jfinal.plugin.activerecord.tx.Tx.java 这个源代码,里面有这种用法,大致分几步:
1:在拦截器中通过某种方式得知当前操作的用户身份,根据登录信息很容易知道
2:通过用户身份,得到该用户的 configName
3:通过 DbKit.getConfig(configName) 得到这个用户的 config 对象
4:通过 config.setThreadLocalConnection(config.getDataSource().getConnection()) 为当前线程设置上 connection 对象
5:调用 inv.invoke()
6:在 finally 块中调用 config.close(connection)