package com.walker.jdbc.ds;
|
|
import com.walker.db.DatabaseType;
|
import com.walker.infrastructure.ApplicationRuntimeException;
|
import com.walker.infrastructure.utils.StringUtils;
|
import com.walker.jdbc.Constants;
|
import com.walker.jdbc.DataSourceMeta;
|
import com.walker.jdbc.util.TextUtils;
|
import com.zaxxer.hikari.HikariDataSource;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
|
/**
|
* 系统默认自定义数据源对象,便于获得一些必要元数据。
|
* @date 2022-08-12
|
* @author 时克英
|
*/
|
public class DefaultDataSource extends HikariDataSource implements DataSourceMeta {
|
|
protected final transient Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
// private String url;
|
private DatabaseType databaseType = null;
|
|
private String username;
|
|
private String password;
|
|
private String databaseName;
|
|
@Override
|
public String getUsername() {
|
return username;
|
}
|
|
public void setUsername(String username) {
|
this.username = username;
|
}
|
|
@Override
|
public String getPassword() {
|
return password;
|
}
|
|
@Override
|
public void setPassword(String password) {
|
this.password = password;
|
}
|
|
@Override
|
public DatabaseType getDatabaseType() {
|
return this.databaseType;
|
}
|
|
@Override
|
public String getUrl() {
|
return this.getJdbcUrl();
|
}
|
|
@Override
|
public String getDatabaseName() {
|
return this.databaseName;
|
}
|
|
@Override
|
public String getIp(){
|
return this.ip;
|
}
|
|
@Override
|
public int getPort(){
|
return this.port;
|
}
|
|
@Override
|
public void setJdbcUrl(String jdbcUrl) {
|
super.setJdbcUrl(jdbcUrl);
|
// this.url = jdbcUrl;
|
logger.info("jdbcUrl = " + jdbcUrl);
|
|
// 解析ip、端口、数据库名称
|
String[] ipAndPortAndService = TextUtils.parseIpAndPortFromUrl(jdbcUrl);
|
if(ipAndPortAndService != null){
|
this.ip = ipAndPortAndService[0];
|
this.port = Integer.parseInt(ipAndPortAndService[1]);
|
this.databaseName = ipAndPortAndService[2];
|
}
|
|
String[] values = jdbcUrl.split(StringUtils.SEPARATOR_COLON);
|
if(values == null || values.length <=1){
|
throw new ApplicationRuntimeException("DataSource set jdbcUrl error: " + jdbcUrl);
|
}
|
|
for(String v : values){
|
if(v.equalsIgnoreCase(DatabaseType.NAME_MYSQL)){
|
this.databaseType = DatabaseType.MYSQL;
|
return;
|
} else if(v.equalsIgnoreCase(DatabaseType.NAME_ORACLE)){
|
this.databaseType = DatabaseType.ORACLE;
|
return;
|
} else if(v.equalsIgnoreCase(DatabaseType.NAME_POSTGRES)){
|
this.databaseType = DatabaseType.POSTGRES;
|
return;
|
} else if(v.equalsIgnoreCase(DatabaseType.NAME_SQLITE)){
|
this.databaseType = DatabaseType.SQLITE;
|
return;
|
} else if(v.equalsIgnoreCase(DatabaseType.NAME_DAMENG)){
|
this.databaseType = DatabaseType.DAMENG;
|
return;
|
} else {
|
//
|
}
|
}
|
|
if(this.databaseType == null){
|
throw new UnsupportedOperationException("不支持的数据库URL参数:" + jdbcUrl);
|
}
|
logger.info("数据库类型:" + this.databaseType.name());
|
}
|
|
@Override
|
public void setDriverClassName(String driverClassName){
|
super.setDriverClassName(driverClassName);
|
logger.debug("driverClassName = " + driverClassName);
|
}
|
|
//=============================================================================================
|
// 以下代码用于手动创建独立数据源使用,比如:采集模块动态创建: DatabaseConnector,2022-09-09,时克英
|
//=============================================================================================
|
|
protected String ip;
|
protected int port = 0;
|
|
public void setDatabaseType(int databaseTypeValue) {
|
this.databaseType = DatabaseType.getType(databaseTypeValue);
|
String driverName = Constants.getDriverClassName(this.databaseType);
|
// String driverName = null;
|
// if(databaseType == DatabaseType.DERBY){
|
// driverName = Constants.DRIVER_NAME_DERBY;
|
// } else if(databaseType == DatabaseType.MYSQL){
|
// driverName = Constants.DRIVER_NAME_MYSQL;
|
// } else if(databaseType == DatabaseType.ORACLE){
|
// driverName = Constants.DRIVER_NAME_ORACLE;
|
// } else if(databaseType == DatabaseType.POSTGRES){
|
// driverName = Constants.DRIVER_NAME_POSTGRES;
|
// } else if(databaseType == DatabaseType.SQLSERVER){
|
// driverName = Constants.DRIVER_NAME_SQLSERVER;
|
// } else if(databaseType == DatabaseType.DAMENG){
|
// driverName = Constants.DRIVER_NAME_DAMENG;
|
// } else
|
// throw new IllegalArgumentException("unsupported database type: " + databaseTypeValue);
|
try {
|
this.setDriverClassName(driverName);
|
} catch (Exception e) {
|
throw new IllegalArgumentException("未找到该驱动:" + driverName, e);
|
}
|
}
|
|
public void setIp(String ip) {
|
assert (StringUtils.isNotEmpty(ip));
|
this.ip = ip;
|
}
|
|
public void setPort(int port) {
|
assert(port > 0 && port < Integer.MAX_VALUE);
|
this.port = port;
|
}
|
|
public void setDatabaseName(String databaseName) {
|
if(databaseType == null){
|
throw new IllegalArgumentException("databaseType must be set firstly!");
|
}
|
if(databaseType != DatabaseType.DERBY && StringUtils.isEmpty(ip)){
|
throw new IllegalArgumentException("ip or port must be set firstly!");
|
}
|
assert (StringUtils.isNotEmpty(databaseName));
|
// this.databaseName = databaseName;
|
|
// StringBuilder url = new StringBuilder();
|
// if(databaseType == DatabaseType.DERBY){
|
// url.append("jdbc:derby:").append(databaseName);
|
//
|
// } else if(databaseType == DatabaseType.MYSQL){
|
// url.append("jdbc:mysql://").append(ip).append(":")
|
// .append(port == 0 ? Constants.DEFAULT_PORT_MYSQL : port)
|
// .append("/").append(databaseName);
|
// // 因为oracle不支持这样设置参数,所以位置调换到这里 2016-11-30
|
// if(url.indexOf("?") >= 0){
|
//// url.append("&autoReconnect=true"); //当数据库连接异常中断时,是否自动重新连接
|
//// url.append("&failOverReadOnly=false"); //自动重连成功后,连接是否设置为只读
|
// url.append("&autoReconnect=true"); //当数据库连接异常中断时,是否自动重新连接
|
// url.append("&failOverReadOnly=false"); //自动重连成功后,连接是否设置为只读
|
// } else {
|
// url.append("?autoReconnect=true");
|
//// url.append("&failOverReadOnly=false");
|
// url.append("&failOverReadOnly=false");
|
// }
|
//
|
// } else if(databaseType == DatabaseType.ORACLE){
|
// url.append("jdbc:oracle:thin:@").append(ip).append(":")
|
// .append(port == 0 ? Constants.DEFAULT_PORT_ORACLE : port)
|
// .append(":").append(databaseName);
|
//
|
// } else if(databaseType == DatabaseType.POSTGRES){
|
// url.append("jdbc:postgresql://").append(ip).append(":")
|
// .append(port == 0 ? Constants.DEFAULT_PORT_POSTGRES : port)
|
// .append("/").append(databaseName);
|
//
|
// } else if(databaseType == DatabaseType.SQLSERVER){
|
// url.append("jdbc:sqlserver://").append(ip).append(":")
|
// .append(port == 0 ? Constants.DEFAULT_PORT_POSTGRES : port)
|
// .append(";DatabaseName=").append(databaseName);
|
//
|
// } else if(databaseType == DatabaseType.DAMENG){
|
// url.append("jdbc:dm://").append(ip).append(":")
|
// .append(port == 0 ? Constants.DEFAULT_PORT_POSTGRES : port)
|
// .append("?SCHEMA=").append(databaseName);
|
// } else
|
// throw new IllegalArgumentException("unsupported database type: " + databaseType);
|
String url = Constants.getJdbcUrl(this.databaseType, databaseName, this.ip, this.port);
|
this.setJdbcUrl(url);
|
|
//=========================================
|
// 创建本地连接数据引擎,20171213,时克英
|
//=========================================
|
// if(localDatabaseStartMode){
|
// address = new Address();
|
// address.setUrl(ip);
|
// address.setPort(port);
|
// address.setService(databaseName);
|
// if(StringUtils.isEmpty(this.getUser()) || StringUtils.isEmpty(this.getPassword())){
|
// throw new IllegalArgumentException("数据库未配置用户名、密码");
|
// }
|
// address.setAuthentication(new String(this.getUser().getBytes()));
|
// address.setCertification(new String(this.getPassword().getBytes()));
|
//
|
// LocalDatabaseMetaEngine localDatabaseMetaEngine = new LocalDatabaseMetaEngine();
|
// localDatabaseMetaEngine.setAddress(databaseType, address);
|
//
|
// MyApplicationConfig.setLocalDatabaseMetaEngine(localDatabaseMetaEngine);
|
// }
|
|
}
|
}
|