使用多数据源
一个应用里边,可以配置多个数据源,也就是可以配置不同的数据库连接地址,包括不同的数据库类型。
应用初始化时,默认有一个 main 模块,业务数据这块配置了一个平台 rds 分配的数据源,默认是 MySQL。
如果想配置多个数据源,可以从单模块或者多模块的维度来使用。这里建议使用多模块的方式来使用。
单模块
单模块中配置多数据源,只适合使用 JDBC 之类的方式获取数据源的连接信息来操作数据库,使用上偏专业代码开发方向。如果要使用低代码的操作方法,建议参考多模块的内容。
单模块也就是只使用默认的 main 模块,由于 1 个模块只能连接 1 个数据源,所以不能以模块的方式来使用其他数据源。但可以获取到其他新加入数据源的连接信息,比如使用 JDBC 的方式来操作数据库。
要新加入数据源,需要在架构图上进行配置。
引入数据库组件
以“开发架构”为例(同理“运行架构”也需要同样的配置操作),打开后,可以在左侧存储区域看到多个数据库的组件,点击其中一个未被引用(没有对勾)的数据库组件,再在中间的画图区域点击即可引入该组件。如图所示:
不能拖入已被引用的数据库组件,当服务模块较多,数据库组件不够用时,可以从市场添加数据库组件
引入数据库组件后,会自动连接到默认的 MySQL 数据库服务器组件。
引入数据库服务器组件
比如要使用 SQLServer 数据源,需要从左侧存储区域引入相应的数据库服务器组件,操作同样是先点击左侧图标,再在中间画图区域点击。如图所示:
引入后,上章节引入的数据库组件,可以改变连接线到这个 SQLServer 数据库服务器组件:
连接后,后续就可以使用这个数据库组件的连接配置来操作数据库了。
这个数据库组件的 id 以 comp.database2 为例,可以在高级的数据库设置中,对该数据库进行配置:
配置后,后续可以使用 Java 代码根据环境变量来获取连接信息。环境变量的命名跟架构图中添加的数据库组件的 ID 有关,如 comp.database2,环境变量的名字则以 COMP_DATABASE2 开头,后面的值是固定值,需要注意都是大写字母,如 COMP_DATABASE2_DBHOST。
获取环境变量,可使用平台自带的 ContextUtil.getEnv() 函数。JDBC 连接代码参考:
- 主要引入
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.justep.util.ContextUtil;
- 业务代码
// 根据数据库组件ID获取对应的环境变量
String COMP_ID = "COMP_DATABASE2";
String dbHost = ContextUtil.getEnv(COMP_ID + "_DBHOST");
String dbPort = ContextUtil.getEnv(COMP_ID + "_DBPORT");
String dbName = ContextUtil.getEnv(COMP_ID + "_DBNAME");
String dbUser = ContextUtil.getEnv(COMP_ID + "_DBUSER");
String dbPasswd = ContextUtil.getEnv(COMP_ID + "_DBPASSWD");
String dbType = ContextUtil.getEnv(COMP_ID + "_DBTYPE");
String dbSchema = ContextUtil.getEnv(COMP_ID + "_DBSCHEMA");
String dbProperties = ContextUtil.getEnv(COMP_ID + "_DBPROPERTIES");
// 不同的数据库类型url的拼接是不一样的,本案例是sqlserver,其他数据库可以参考java中标准的jdbc连接url的拼接
String url = "jdbc:jtds:" + dbType + "://" + dbHost + ":" + dbPort + ";databaseName=" + dbName;//自己判断是否有数据库连接属性进行拼接
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
conn = DriverManager.getConnection(url, dbUser, dbPasswd);
String sql = "select * from dbo.AP_RQ";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString("fName") );
}
} catch (ClassNotFoundException e) {
System.out.println("加载驱动异常");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库异常");
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close(); // 关闭结果数据集
if (stmt != null)
stmt.close(); // 关闭执行环境
if (conn != null)
conn.close(); // 关闭数据库连接
} catch (SQLException e) {
e.printStackTrace();
}
}
注意:这里只是以“开发架构”为例,同理也需要配置“运行架构”,否则运行环境获取不到相关的数据库连接配置。
多模块
多模块是平台推荐使用的配置多数据源的方式,每个模块可连接一个数据源,比如新开一个 pm 模块连接 SQLServer 数据源。
新增模块
新增模块可以在架构图引入 SpringBoot 服务模板(SpringBoot 项目使用这个模板)来实现。
以“开发架构”为例,在左侧市场中点击“SpringBoot 服务模板”(如果没有该图标,需要点击 + 号从市场先下载下来),再在架构图中点击空白处引入进来,引入后需要填写模块名,这里比如 pm。
新建模块后,该模块会默认连接到业务数据库,此时需要根据实际情况,把连接线修改到其他数据库(引入其他数据库,参考单模块的操作),比如 database2,这个数据库组件最终会指向其他的数据源,比如 SQLServer,这样相当于 pm 模块后续就可以使用 SQLServer 数据源了。
pm 新模块添加后,保存架构图重启,在代码的 model/service/pm 目录下可找到对应后端的相关代码,一个模块本质上就一个标准的 SpringBoot 工程。
数据源配置
pm 模块对应的 database2 的连接配置,同样也是在高级的数据库设置进行操作。
添加新模块的界面端
为了在界面中切换到这个新模块,需要在高级的“多模块多端配置”添加这个新模块。
打开配置后,填写以下内容:
- 界面端名称:一般写新模块的标识,比如 pm,或者写对应的中文名称。
- 界面端标识:一般写新模块的标识-pcx,比如 pm-pcx。
- 服务标识:这里需要完全对应 service 的目录名,这个就是写新模块的标识,比如 pm。
- 设备类型:一般改成桌面。
点击保存后,需要根据提示刷新一下页面,才能把新模块的界面端显示出来。
点击即可切换到新模块的界面端。在这个界面端下,页面、数据和服务都是新的内容,后续添加内容后都会放到此模块下。
在新模块下建立的数据模型,就会根据此模块对应的数据源,比如 SQLServer,生成对应的物理数据库表,因此实现了一个应用多数据源的配置和访问。
开了多模块之后,后续需要相互引用各个模块的数据模型,参考《跨模块跨应用访问数据集》。
注意:这里只是以“开发架构”为例,同理也需要配置“运行架构”,否则运行环境获取不到相关的数据库连接配置。