项目版本简介
项目pom,maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.9.RELEASE</version>
<relativePath/>
</parent>
</dependencies>
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-spring</artifactId>
<version>4.1.13</version>
</dependency>
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-dataway</artifactId>
<version>4.1.13</version>
</dependency>
</dependencies>
多数据源配置
在springboot配置文件application.properties中配置如下
#first
spring.datasource.jdbc-url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=
#second
spring.second-datasource.jdbc-url=
spring.second-datasource.username=
spring.second-datasource.password=
spring.second-datasource.driver-class-name=
数据源交给spring管理(按照springboot多数据源配置)
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "datasourceB")
@Qualifier("datasourceB")
@ConfigurationProperties(prefix = "spring.second-datasource")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}
}
实现SpringModule方法,加载Module,添加数据源
import net.hasor.core.ApiBinder;
import net.hasor.core.DimModule;
import net.hasor.dataql.fx.db.LookupDataSourceListener;
import net.hasor.db.JdbcModule;
import net.hasor.db.Level;
import net.hasor.spring.SpringModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
@DimModule
@Component
public class ExampleModule implements SpringModule {
@Autowired
private DataSource dataSource = null;
@Autowired
@Qualifier("datasourceB")
private DataSource datasourceB = null;
@Override
public void loadModule(ApiBinder apiBinder) throws Throwable {
// .DataSourceEntity form Spring boot into Hasor
apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
apiBinder.installModule(new JdbcModule(Level.Full, "datasourceB", this.datasourceB )); // 数据源B
}
多数据源添加完成!页面指定hint FRAGMENT_SQL_DATA_SOURCE = “datasourceB” 就能访问到指定的数据源了
动态数据源实现
通过实现LookupDataSourceListener完成动态数据源的添加
import net.hasor.dataql.fx.db.LookupDataSourceListener;
import javax.sql.DataSource;
public class MyLookupDataSourceListenerImpl implements LookupDataSourceListener {
@Override
public DataSource lookUp(String lookupName) {
//通过用spring管理的Bean添加
DataSourceConfig dataSourceConfig = (DataSourceConfig)SpringContextHelper.getSpringBean("dataSourceConfig");
DataSource dataSource = dataSourceConfig.getDataSource(lookupName);
return dataSource;
}
}
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
@Component("dataSourceConfig")
public class DataSourceConfig {
@Autowired
private DynamicDataSourceManager dynamicDataSourceManager;
@Autowired
private IDataSourceService iDataSourceService;
public DataSource getDataSource(String lookupName) {
//这里去数据库查询数据源基本信息(也可自己维护一个Map,每次去Map里面去拿也OK)
DataSourceEntity dataSourceEntity = iDataSourceService.getById(lookupName);
HikariDataSource dataSourcePool = dynamicDataSourceManager.createDataSourcePool(dataSourceEntity);
return dataSourcePool;
}
}
最后在多数据源加载Module的ExampleModule中添加
apiBinder.bindSpiListener(LookupDataSourceListener.class, new MyLookupDataSourceListenerImpl());
完整代码
import net.hasor.core.ApiBinder;
import net.hasor.core.DimModule;
import net.hasor.dataql.fx.db.LookupDataSourceListener;
import net.hasor.db.JdbcModule;
import net.hasor.db.Level;
import net.hasor.spring.SpringModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
@DimModule
@Component
public class ExampleModule implements SpringModule {
@Autowired
private DataSource dataSource = null;
@Autowired
@Qualifier("datasourceB")
private DataSource datasourceB = null;
@Override
public void loadModule(ApiBinder apiBinder) throws Throwable {
// .DataSourceEntity form Spring boot into Hasor
apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
apiBinder.installModule(new JdbcModule(Level.Full, "datasourceB", this.datasourceB )); // 数据源B
//
apiBinder.bindSpiListener(LookupDataSourceListener.class, new MyLookupDataSourceListenerImpl());
}
动态添加数据源完成!
结语
这儿通过 SPI 查找数据源
链接地址: https://www.hasor.net/web/dataway/spi.html#lookupdatasourcelistener.