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"); } } }