首先要确定多数据源是指什么。
如果多数据源是指系统中的表分别放到不同数据库里(比如,栏目表cms_node
放到A数据库,文章表cms_info
放到B数据库),这种情况是不支持的。
如果是系统中的表放到一个数据库里,但还希望通过二次开发从其它数据库里读取一些数据,这种情况是可以的。
Jspxcms系统中使用的框架是spring-boot、spring-data-jpa。本质上说,是否支持多数据源只和这些框架有关,和系统本身无关。spring-boot官方文档里有介绍多个数据源的配置方法 https://docs.spring.io/spring-boot/docs/1.5.20.RELEASE/reference/htmlsingle/#howto-two-datasources ,网上也有大量的教程。
配置文件src/main/resources/application.properties
。
将默认数据库配置的spring.datasource
前缀改为app.datasource.first
,另外再创建第二个数据源app.datasource.second
。
#spring.datasource.url=jdbc:mysql://localhost/jspxcms?characterEncoding=utf8
#spring.datasource.username=root
#spring.datasource.password=password
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
app.datasource.first.url=jdbc:mysql://localhost/jspxcms?characterEncoding=utf8
app.datasource.first.username=root
app.datasource.first.password=password
app.datasource.first.driver-class-name=com.mysql.jdbc.Driver
app.datasource.second.url=jdbc:mysql://localhost/second_database?characterEncoding=utf8
app.datasource.second.username=root
app.datasource.second.password=password
app.datasource.second.driver-class-name=com.mysql.jdbc.Driver
在Java配置文件中增加数据源配置代码com.jspxcms.core.Application
。第二个数据源使用JdbcTemplate
访问数据。
@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSource dataSource() {
return dataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean
@ConfigurationProperties("app.datasource.second")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("app.datasource.second")
public DataSource secondDataSource() {
return secondDataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(secondDataSource());
}
至此多个数据源配置完成。使用范例如下:
@Controller
public class MyController {
@GetMapping("/second_data_source")
public String index(HttpServletRequest request, org.springframework.ui.Model modelMap) {
List<Map<String, Object>> data = jdbcTemplate.queryForList("select * from my_table");
for (Map<String, Object> d : data) {
System.out.println(d.get("my_field"));
}
}
@Autowired
private JdbcTemplate jdbcTemplate;
}