话不多说直接上代码
package com.hualongdata.dataway.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.hualongdata.dataway.common.BusinessException;
import com.hualongdata.dataway.entity.BusiDbCfg;
import com.hualongdata.dataway.service.BusiDbCfgService;
import lombok.extern.slf4j.Slf4j;
import net.hasor.dataql.fx.db.LookupDataSourceListener;
import com.hualongdata.dataway.tool.DesCipher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.*;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author LW
* @date 2020/9/3 10:27
*/
@Slf4j
@Component
public class BusiDbLookUpSpi implements LookupDataSourceListener {
@Autowired
private BusiDbCfgService busiDbCfgService;
private Map<Long, DataSource> busiDbPool = new ConcurrentHashMap<>();
@PostConstruct
public void init(){
BusiDbCfg dbQuery = new BusiDbCfg();
List<BusiDbCfg> dbCfgList = busiDbCfgService.queryAll(dbQuery);
dbCfgList.forEach(dbCfg -> {
Long id = dbCfg.getId();
String dbname = dbCfg.getDbname();
String driverclassname = dbCfg.getDriverclassname();
String url = dbCfg.getUrl();
String username = dbCfg.getUsername();
String password = dbCfg.getPassword();
password = password == null ? null : DesCipher.decrypt(password);
DataSource ds = buildDataSource(url, driverclassname, username, password);
busiDbPool.put(id, ds);
});
}
@Override
public DataSource lookUp(String lookupName) {
Long dbId = Long.valueOf(lookupName);
DataSource busiDb = busiDbPool.get(dbId);
if(busiDb == null){
BusiDbCfg dbCfg = busiDbCfgService.queryById(dbId);
if(dbCfg == null){
throw new BusinessException("dbId [" + dbId + "] is invalid.");
}
Long id = dbCfg.getId();
String dbname = dbCfg.getDbname();
String driverclassname = dbCfg.getDriverclassname();
String url = dbCfg.getUrl();
String username = dbCfg.getUsername();
String password = dbCfg.getPassword();
password = password == null ? null : DesCipher.decrypt(password);
busiDb = buildDataSource(url, driverclassname, username, password);
busiDbPool.put(id, busiDb);
}
return busiDb;
}
/**
* 这里初始化数据库
* @param url
* @param driverclassname
* @param username
* @param password
* @return
*/
public DataSource buildDataSource(String url, String driverclassname, String username, String password) {
return driverclassname.indexOf("hive") > -1 || driverclassname.indexOf("presto") > -1 ? buildHadoopDataSource(url, driverclassname, username, password) : buildRdbDataSource(url, driverclassname, username, password);
}
public DataSource buildRdbDataSource(String url, String driverclassname, String username, String password) {
DruidDataSource ds = new DruidDataSource();
ds.setUrl(url);
ds.setDriverClassName(driverclassname);
ds.setUsername(username);
ds.setPassword(password);
ds.setInitialSize(1);
ds.setMinIdle(1);
ds.setMaxActive(20);
ds.setMaxWait(10000);
ds.setValidationQuery("select 1");
ds.setTestWhileIdle(true);
ds.setTestOnBorrow(true);
ds.setTimeBetweenEvictionRunsMillis(60000);
ds.setMinEvictableIdleTimeMillis(300000);
return ds;
}
/**
* 这里处理hive和presto的情况
* @param url
* @param driverclassname
* @param username
* @param password
* @return
*/
public DataSource buildHadoopDataSource(String url, String driverclassname, String username, String password) {
Class clz = null;
try {
clz = Class.forName(driverclassname);
} catch (Exception e) {
log.error("驱动类加载失败:"+driverclassname, e);
}
SimpleDriverDataSource ds = new SimpleDriverDataSource();
ds.setUrl(url);
ds.setDriverClass(clz);
ds.setUsername(username);
ds.setPassword("".equals(password) ? null : password);
return ds;
}
public void removeDataSourceFromPool(Long dbId){
busiDbPool.remove(dbId);
}
}
后面就是初始化Dataway的一些操作了,具体去官网查看
import net.hasor.core.ApiBinder;
import net.hasor.core.DimModule;
import net.hasor.core.TypeSupplier;
import net.hasor.dataql.fx.db.LookupDataSourceListener;
import net.hasor.dataway.spi.CompilerSpiListener;
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.stereotype.Component;
import javax.sql.DataSource;
import java.util.function.Supplier;
@DimModule
@Component
public class ExampleModule implements SpringModule {
@Autowired
private DataSource dataSource;
/**
* Hasor 启动的时候会调用 loadModule 方法,在这里再把 DataSource 设置到 Hasor 中。
* @param apiBinder
* @throws Throwable
*/
@Override
public void loadModule(ApiBinder apiBinder) throws Throwable {
final TypeSupplier springTypeSupplier = springTypeSupplier(apiBinder);
apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
// 在注册SPI时,把SPI的创建委托给Spring
apiBinder.bindSpiListener(LookupDataSourceListener.class, (Supplier<LookupDataSourceListener>) (() -> springTypeSupplier.get(BusiDbLookUpSpi.class)));
apiBinder.bindSpiListener(CompilerSpiListener.class, (Supplier<CompilerSpiListener>) () -> springTypeSupplier.get(EnhanceDataqlSpi.class));
}
}