比較喜歡JFinal簡單的設計。可是咱們的很多項目都須要鏈接至少兩個數據庫,而JFinal的ActiveRecord對多數據源支持比較若。週末斷斷續續花了一天的時間對JFinal進行的ActiveRecord作改造。java
設計目標以下:
1)既有的單數據源的JFinal代碼不用修改一行代碼就能夠天然支持。
2)Model,Record都支持多數據源,並且改動量要小。
3)性能不能很大損失。
實現思路:
1)一個數據源即一個分組(group),多個數據源既有多個分組,每一個Mode只能屬於一個分組。Record不限制分組。
2)default是一個默認分組,當不指定分組名師,默認採用default分組。這個用來解決兼容問題。
3)儘可能啓動時計算一下,減小每次請求的計算。數據庫
實現結果:
1)原來的JFinal方式兼容,可是刪除掉了Model和Record中關於DataSource爲參數的操做,給位group
多數據源方式:api
@Override public void configPlugin(Plugins me) { //從配置文件中獲取數據庫配置項 PropertyConfig config = PropertyConfig.me(); //a數據源 DruidPlugin aDruidPlugin = new DruidPlugin( config.getProperty("a.dataSource.url"), config.getProperty("a.dataSource.userName"), config.getProperty("a.dataSource.password"), config.getProperty("a.dataSource.driverClass")); aDruidPlugin.setInitialSize(3).setMaxActive(10); //b數據源 DruidPlugin bDruidPlugin = new DruidPlugin( config.getProperty("b.dataSource.url"), config.getProperty("b.dataSource.userName"), config.getProperty("b.dataSource.password"), config.getProperty("b.dataSource.driverClass")); bDruidPlugin.setInitialSize(3).setMaxActive(10); //加載數據庫鏈接池插件 me.add(aDruidPlugin); me.add(bDruidPlugin); //分組a,數據源b ActiveRecordPlugin aArp = new ActiveRecordPlugin("aGroup",aDruidPlugin); aArp.setShowSql(true); aArp.addMapping("t_admin_user", AdminUser.class); aArp.addMapping("t_charge_history", ChargeHistory.class); aArp.addMapping("t_sms_api_user", SmsApiUser.class); me.add(aArp); //分組b,數據源b ActiveRecordPlugin bArp = new ActiveRecordPlugin("bGroup",bDruidPlugin); bArp.setDialect(new PostgreSqlDialect()); bArp.setShowSql(true); bArp.addMapping("t_send_message_history", SendMessageHistory.class); me.add(bArp); }
差別在於ActiveRecordPlugin多了一個構造函數。Model的寫法和之前同樣。不用改變。app
若是要在Controller上配置事務(TX系列攔截器)攔截器,configRoute(Routes me) 函數也得作必定改變。若不用事務攔截器,則還和原來同樣。使用攔截器的話代碼以下:less
public void configRoute(Routes me) { me.addWithGroup("aGroup","/", IndexController.class); me.addWithGroup("aGroup","/au",AdminUserController.class); me.addWithGroup("aGroup","/sau", SmsApiUserController.class); me.addWithGroup("bGroup","/smh",SendMessageHistoryController.class); }