package com.walker.connector.util;
import com.walker.connector.Address;
import com.walker.connector.db.DamengConnector;
import com.walker.connector.db.MySqlConnector;
import com.walker.connector.db.OracleConnector;
import com.walker.connector.db.PostgresConnector;
import com.walker.connector.support.DatabaseConnector;
import com.walker.db.DatabaseType;
import com.walker.infrastructure.utils.StringUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.interceptor.TransactionProxyFactoryBean;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* 连接器工具类
* @author shikeying
* @date 2015年12月17日
*
*/
public abstract class ConnectorUtils {
/**
* 创建带事务管理的,数据库连接器对象。
* 事务规则如下:
*
* "query*", "PROPAGATION_SUPPORTS,readOnly"
* "exec*", "PROPAGATION_REQUIRED, -Exception"
*
* @param connector
* @return
*/
public static final DatabaseConnector acquireTransactionProxyConnector(DatabaseConnector connector){
PlatformTransactionManager transactionManager = new DataSourceTransactionManager(connector.getDataSource());
// 定义事务规则
Properties transactionAttributes = new Properties();
transactionAttributes.put("query*", "PROPAGATION_SUPPORTS,readOnly");
transactionAttributes.put("exec*", "PROPAGATION_REQUIRED, -Exception");
TransactionProxyFactoryBean transactionProxy = new TransactionProxyFactoryBean();
transactionProxy.setTransactionManager(transactionManager);
transactionProxy.setTransactionAttributes(transactionAttributes);
transactionProxy.setProxyTargetClass(true);
transactionProxy.setTarget(connector);
transactionProxy.afterPropertiesSet();
return (DatabaseConnector)transactionProxy.getObject();
}
public static final DatabaseConnector createMySQLConnector(DataSource ds){
return doCreateMySqLConnector(null, false, ds);
}
/**
* 创建MySQL的连接器
* @param address
* @return
*/
public static final DatabaseConnector createMySQLConnector(Address address){
return doCreateMySqLConnector(address, false, null);
}
/**
* 创建MySQL的管理连接器,没有库名
* @param address
* @return
*/
public static final DatabaseConnector createMySQLManageConnector(Address address){
return doCreateMySqLConnector(address, true, null);
}
private static DatabaseConnector doCreateMySqLConnector(Address address
, boolean manageMode, DataSource ds){
MySqlConnector dbConnector;
if(ds != null){
// 如果存在数据源,直接注入创建Connector对象
dbConnector = new MySqlConnector(ds);
return dbConnector;
}
// // 2023-05-04,使用系统配置统一数据源,否则会出现:业务用druid,而元数据用Hikari情况
// if(JdbcInspector.getInstance() != null){
// dbConnector = new MySqlConnector((DataSource) JdbcInspector.getInstance().getPrimaryDataSourceMeta());
// return dbConnector;
// }
dbConnector = new MySqlConnector();
dbConnector.setUrl(address.getUrl());
dbConnector.setPort(address.getPort());
//设置数据库名字,后面拼接字符集
// dbConnector.setServiceName("walkersoft-share-marks?characterEncoding=UTF-8");
if(manageMode){
dbConnector.setManageMode();
} else {
if(StringUtils.isEmpty(address.getServiceName())){
throw new IllegalArgumentException("未设置连接数据库名称:address.service = null.");
}
dbConnector.setServiceName(address.getServiceName()+"?characterEncoding=UTF-8");
}
Map parameters = new HashMap(5);
parameters.put(DatabaseConnector.OPTION_USER, address.getAuthentication());
parameters.put(DatabaseConnector.OPTION_PASSWORD, address.getCertification());
if(address.getMaxActive() > 0){
parameters.put(DatabaseConnector.OPTION_MAX_ACTIVE, String.valueOf(address.getMaxActive()));
} else {
parameters.put(DatabaseConnector.OPTION_MAX_ACTIVE, "6");
}
if(address.getMaxIdle() > 0){
parameters.put(DatabaseConnector.OPTION_MAX_IDLE, String.valueOf(address.getMaxIdle()));
} else {
parameters.put(DatabaseConnector.OPTION_MAX_IDLE, "6");
}
if(address.getInitSize() > 0){
parameters.put(DatabaseConnector.OPTION_INIT_SIZE, String.valueOf(address.getInitSize()));
} else {
parameters.put(DatabaseConnector.OPTION_INIT_SIZE, "3");
}
dbConnector.setParameters(parameters);
dbConnector.initialize();
return dbConnector;
}
public static final DatabaseConnector createOracleConnector(DataSource ds){
return doCreateOracleConnector(null, false, ds);
}
public static final DatabaseConnector createOracleConnector(Address address){
return doCreateOracleConnector(address, false, null);
}
public static final DatabaseConnector createOracleManageConnector(Address address){
return doCreateOracleConnector(address, true, null);
}
/**
* 创建达梦数据库连接器对象,不是管理端,只能连特定数据库。
* @param address
* @return
* @date 2023-03-03
*/
public static final DatabaseConnector createDamengConnector(Address address){
return doCreateDamengConnector(address, false, null);
}
public static final DatabaseConnector createDamengManageConnector(Address address){
return doCreateDamengConnector(address, true, null);
}
private static DatabaseConnector doCreateDamengConnector(Address address, boolean manageMode, DataSource ds){
DamengConnector dbConnector;
if(ds != null){
// 如果存在数据源,直接注入创建Connector对象
dbConnector = new DamengConnector(ds);
return dbConnector;
}
// // 2023-05-04,使用系统配置统一数据源,否则会出现:业务用druid,而元数据用Hikari情况
// if(JdbcInspector.getInstance() != null){
// dbConnector = new DamengConnector((DataSource) JdbcInspector.getInstance().getPrimaryDataSourceMeta());
// return dbConnector;
// }
dbConnector = new DamengConnector();
dbConnector.setUrl(address.getUrl());
dbConnector.setPort(address.getPort());
if(manageMode){
dbConnector.setManageMode();
} else {
if(StringUtils.isEmpty(address.getServiceName())){
throw new IllegalArgumentException("未设置连接数据库名称:address.service = null.");
}
dbConnector.setServiceName(address.getServiceName());
}
Map parameters = new HashMap(5);
parameters.put(DatabaseConnector.OPTION_USER, address.getAuthentication());
parameters.put(DatabaseConnector.OPTION_PASSWORD, address.getCertification());
parameters.put(DatabaseConnector.OPTION_MAX_ACTIVE, "6");
parameters.put(DatabaseConnector.OPTION_MAX_IDLE, "3");
parameters.put(DatabaseConnector.OPTION_INIT_SIZE, "3");
dbConnector.setParameters(parameters);
dbConnector.initialize();
return dbConnector;
}
private static DatabaseConnector doCreateOracleConnector(Address address
, boolean manageMode, DataSource ds){
OracleConnector dbConnector;
if(ds != null){
// 如果存在数据源,直接注入创建Connector对象
dbConnector = new OracleConnector(ds);
return dbConnector;
}
// // 2023-05-04,使用系统配置统一数据源,否则会出现:业务用druid,而元数据用Hikari情况
// if(JdbcInspector.getInstance() != null){
// dbConnector = new OracleConnector((DataSource) JdbcInspector.getInstance().getPrimaryDataSourceMeta());
// return dbConnector;
// }
dbConnector = new OracleConnector();
dbConnector.setUrl(address.getUrl());
dbConnector.setPort(address.getPort());
if(manageMode){
dbConnector.setManageMode();
} else {
if(StringUtils.isEmpty(address.getServiceName())){
throw new IllegalArgumentException("未设置连接数据库名称:address.service = null.");
}
dbConnector.setServiceName(address.getServiceName());
}
Map parameters = new HashMap(5);
parameters.put(DatabaseConnector.OPTION_USER, address.getAuthentication());
parameters.put(DatabaseConnector.OPTION_PASSWORD, address.getCertification());
parameters.put(DatabaseConnector.OPTION_MAX_ACTIVE, "6");
parameters.put(DatabaseConnector.OPTION_MAX_IDLE, "3");
parameters.put(DatabaseConnector.OPTION_INIT_SIZE, "3");
dbConnector.setParameters(parameters);
dbConnector.initialize();
return dbConnector;
}
public static final DatabaseConnector createPostgresConnector(Address address){
return doCreatePostgresConnector(address, false);
}
public static final DatabaseConnector createPostgresManageConnector(Address address){
return doCreatePostgresConnector(address, true);
}
private static DatabaseConnector doCreatePostgresConnector(Address address, boolean manageMode){
PostgresConnector dbConnector = new PostgresConnector();
// // 2023-05-04,使用系统配置统一数据源,否则会出现:业务用druid,而元数据用Hikari情况
// if(JdbcInspector.getInstance() != null){
// dbConnector = new PostgresConnector((DataSource) JdbcInspector.getInstance().getPrimaryDataSourceMeta());
// return dbConnector;
// }
dbConnector.setUrl(address.getUrl());
dbConnector.setPort(address.getPort());
if(manageMode){
dbConnector.setManageMode();
} else {
if(StringUtils.isEmpty(address.getServiceName())){
throw new IllegalArgumentException("未设置连接数据库名称:address.service = null.");
}
dbConnector.setServiceName(address.getServiceName());
}
Map parameters = new HashMap(5);
parameters.put(DatabaseConnector.OPTION_USER, address.getAuthentication());
parameters.put(DatabaseConnector.OPTION_PASSWORD, address.getCertification());
parameters.put(DatabaseConnector.OPTION_MAX_ACTIVE, "20");
// parameters.put(DatabaseConnector.OPTION_MAX_IDLE, "3");
parameters.put(DatabaseConnector.OPTION_INIT_SIZE, "3");
dbConnector.setParameters(parameters);
dbConnector.initialize();
return dbConnector;
}
/**
* 返回一个数据库连接器对象
* @param addr 数据库连接地址
* @param manage 是否管理连接,管理连接没有数据库名
* @return
*/
public static final DatabaseConnector getDbConnectorByType(Address addr
, boolean manage, DatabaseType databaseType){
if(databaseType == DatabaseType.MYSQL){
if(manage){
return ConnectorUtils.createMySQLManageConnector(addr);
} else {
return ConnectorUtils.createMySQLConnector(addr);
}
} else if(databaseType == DatabaseType.POSTGRES){
if(manage){
return ConnectorUtils.createPostgresManageConnector(addr);
} else {
return ConnectorUtils.createPostgresConnector(addr);
}
} else if(databaseType == DatabaseType.ORACLE){
if(manage){
return ConnectorUtils.createOracleManageConnector(addr);
} else {
return ConnectorUtils.createOracleConnector(addr);
}
} else if (databaseType == DatabaseType.DAMENG) {
if(manage){
return ConnectorUtils.createDamengManageConnector(addr);
} else {
return ConnectorUtils.createDamengConnector(addr);
}
} else {
throw new UnsupportedOperationException("未实现对其他数据库的支持:DatabaseConnector");
}
}
}