为什么要有多数据源?
通常一个系统只需要连接一个数据库就可以了,Jeecg数据源是配置在spring-mvc-hibernate.xml文件中,这种数据源我们叫做主数据源。但是在企业应用的开发中往往会和其他子系统交互,特别是对于一些数据实时性要求比较高的数据,我们就需要做实时连接查询,而不是做同步。这个时候就需要用到多数据源。 举个简单的例子某企业要做订单网上订单系统这里面就可以涉及到多个子系统的连接,比如:产品主数据的数据源,项目管理系统的数据源(项目可以产品订单)等多个不同数据库类似的数据源,他们可能是ORACLE,SQL SERVER,MYSQL等多种混合数据源。
Jeecg多数据源的设计原理
多数据源的设计有多种方案,网上有很多是设计在spring-mvc-hibernate.xml文件中,通过在不同线程中datasource动态切换来实现,这样使得配置,程序太过复杂,所以Jeecg并没有使用这种方法。 Jeecg多数据源设计很简单就是直接利用 springjdbc连接,跟Hibernate或者MyBatis等持久化框架无关。就是我们最原始的类似JDBC的连接原理一样,只不过我们这里使用了springjdbc更加成熟的连接方法。 我们把多数据源的配置信息单独放在t_s_data_source表里维护管理。
Jeecg多数据的实现方法:
创建t_s_data_source表,结构如下,并把该表的内容在TOMCAT启动时添加到缓存(缓存机制查看类:InitListener),以t_s_data_source.key字段为key值,以t_s_data_source的实体类为value放到static Map中
id | db_key | description | driver_class | url | db_user | db_password | db_type |
SAP_DB | sap db | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@10.10.0.59:1521:mid | CRM | CRM2013 | oracle | |
新建动态数据的操作类:org.jeecgframework.core.util.DynamicDBUtil.java,该类集中放置了对数据库的连接,SQL查询,更新,删除,添加等操作常用方法。
- 系统管理-多数据源管理菜单可以实际对t_s_data_source表的维护
- 在Service层即可以调用DynamicDBUtil中的方法得到数据库连接并可以执行SQL
- 举例:
- 插入修改数据:DynamicDBUtil.update('SAP_DB','delete from user ??'); 返回:int
- 查询单条数据: DynamicDBUtil.findOne('SAP_DB','delete from user ??'); 返回:Map<String, Object>
- 查询数据列表:DynamicDBUtil.findList('SAP_DB','delete from user ??'); 返回:List<Map<String, Object>>
调用示例:
package com.jeecg.system.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jeecgframework.core.util.DynamicDBUtil;
import org.jeecgframework.core.util.PasswordUtil;
import org.jeecgframework.core.util.ResourceUtil;
import org.jeecgframework.core.util.DynamicDBUtil.GwyuTest;
import org.jeecgframework.web.system.pojo.base.DynamicDataSourceEntity;
public class Test {
public static void main(String[] args) {
DynamicDataSourceEntity dynamicSourceEntity = new DynamicDataSourceEntity();
String dbKey = "mysql";
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/shuilangyizu";
String dbUser = "shuilangyizu";
String dbPassword = "shuilangyizu";
dbPassword = PasswordUtil.encrypt(dbPassword, dbUser, PasswordUtil.getStaticSalt());
dynamicSourceEntity.setDbKey(dbKey);
dynamicSourceEntity.setDriverClass(driverClassName);
dynamicSourceEntity.setUrl(url);
dynamicSourceEntity.setDbUser(dbUser);
dynamicSourceEntity.setDbPassword(dbPassword);
ResourceUtil.dynamicDataSourceMap.put(dbKey, dynamicSourceEntity);
HashMap<String, Object> data = new HashMap<String, Object>();
String sql = "SELECT * FROM t_s_base_user WHERE id = :id";
data.put("id", "###");
Map<String, Object> user = (Map<String, Object>) DynamicDBUtil.findOneByHash(dbKey, sql, data);
System.out.println(user.get("realname"));
}
}