package com.wgcloud.util.jdbc; import cn.hutool.core.collection.CollectionUtil; import com.wgcloud.config.CommonConfig; import com.wgcloud.entity.DbInfo; import com.wgcloud.entity.DbTable; import com.wgcloud.service.DbInfoService; import com.wgcloud.service.LogInfoService; import com.wgcloud.util.DateUtil; import com.wgcloud.util.FormatUtil; import com.wgcloud.util.ThreadPoolUtil; import com.wgcloud.util.msg.WarnMailUtil; import com.wgcloud.util.msg.WarnPools; import com.wgcloud.util.staticvar.StaticKeys; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; import java.util.Map; /** * @version v3.3 * @ClassName:ConnectionUtil.java * @author: http://www.wgstart.com * @date: 2021年1月16日 * @Description: ConnectionUtil.java * @Copyright: 2019-2021 wgcloud. All rights reserved. */ @Component public class ConnectionUtil { private static final Logger logger = LoggerFactory.getLogger(ConnectionUtil.class); @Resource private LogInfoService logInfoService; @Resource private DbInfoService dbInfoService; @Autowired CommonConfig commonConfig; public JdbcTemplate getJdbcTemplate(DbInfo dbInfo) throws Exception { JdbcTemplate jdbcTemplate = null; String driver = ""; String url = dbInfo.getDbUrl(); if (RDSConnection.KEY_MYSQL.equals(dbInfo.getDbType())) { driver = RDSConnection.DRIVER_MYSQL; } else if (RDSConnection.KEY_MARIADB.equals(dbInfo.getDbType())) { driver = RDSConnection.DRIVER_MARIADB; } else if (RDSConnection.KEY_POSTGRESQL.equals(dbInfo.getDbType())) { driver = RDSConnection.DRIVER_POSTGRESQL; } else if (RDSConnection.KEY_SQLSERVER.equals(dbInfo.getDbType())) { driver = RDSConnection.DRIVER_SQLSERVER; } else if (RDSConnection.KEY_DB2.equals(dbInfo.getDbType())) { driver = RDSConnection.DRIVER_DB2; } else { driver = RDSConnection.DRIVER_ORACLE; } try { //创建连接池 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(dbInfo.getUserName()); dataSource.setPassword(dbInfo.getPasswd()); jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.setQueryTimeout(120);//超时120s if (RDSConnection.KEY_MYSQL.equals(dbInfo.getDbType())) { jdbcTemplate.queryForRowSet(RDSConnection.MYSQL_VERSION); } else if (RDSConnection.KEY_MARIADB.equals(dbInfo.getDbType())) { jdbcTemplate.queryForRowSet(RDSConnection.MYSQL_VERSION); } else if (RDSConnection.KEY_POSTGRESQL.equals(dbInfo.getDbType())) { jdbcTemplate.queryForRowSet(RDSConnection.MYSQL_VERSION); } else if (RDSConnection.KEY_SQLSERVER.equals(dbInfo.getDbType())) { jdbcTemplate.queryForRowSet(RDSConnection.SQLSERVER_VERSION); } else if (RDSConnection.KEY_DB2.equals(dbInfo.getDbType())) { jdbcTemplate.queryForRowSet(RDSConnection.DB2_VERSION); } else { jdbcTemplate.queryForRowSet(RDSConnection.ORACLE_VERSION); } dbInfo.setDbState(StaticKeys.ON_STATE); if (null != WarnPools.MEM_WARN_MAP && null != WarnPools.MEM_WARN_MAP.get(dbInfo.getId())) { Runnable runnable = () -> { WarnMailUtil.sendDbDown(dbInfo, false); }; ThreadPoolUtil.executor.execute(runnable); } //只有数据源在线时候,才更新时间,连接失败就不更新时间 dbInfo.setCreateTime(DateUtil.getNowTime()); dbInfoService.updateById(dbInfo); return jdbcTemplate; } catch (Exception e) { jdbcTemplate = null; logger.error("连接数据库错误", e); dbInfo.setDbState(StaticKeys.DOWN_STATE); dbInfoService.updateById(dbInfo); Runnable runnable = () -> { WarnMailUtil.sendDbDown(dbInfo, true); }; ThreadPoolUtil.executor.execute(runnable); } return null; } public long queryTableCount(DbInfo dbInfo, JdbcTemplate jdbcTemplate, DbTable dbTable) { try { dbTable.setState(StaticKeys.ON_STATE); String sqlinkey = FormatUtil.haveSqlDanger(dbTable.getWhereVal(), commonConfig.getSqlInKeys()); if (!StringUtils.isEmpty(sqlinkey)) { String errinfo = "统计SQL语句含有sql敏感字符" + sqlinkey; logger.error("统计数据表错误:" + errinfo); logInfoService.save(errinfo + ":" + dbInfo.getAliasName(), "数据库别名:" + dbInfo.getAliasName() + ",数据表别名:" + dbTable.getRemark() + ",错误信息:" + errinfo, StaticKeys.LOG_XTCZ); return 0; } if (null == jdbcTemplate) { dbTable.setState(StaticKeys.DOWN_STATE); return 0; } List> list = jdbcTemplate.queryForList(dbTable.getWhereVal()); if (CollectionUtil.isEmpty(list)) { return 0; } else { //取第一行 Map mapResult = list.get(0); String resultStr = "0"; if (StringUtils.isEmpty(dbTable.getTableName())) { //如果没有设置取值列名,默认取值 for (String key : mapResult.keySet()) { resultStr = mapResult.get(key).toString(); } } else { resultStr = mapResult.get(dbTable.getTableName()).toString(); } if (resultStr.indexOf(".") > -1) { return Double.valueOf(resultStr).longValue(); } else { return Long.valueOf(resultStr); } } } catch (Exception e) { dbTable.setState(StaticKeys.DOWN_STATE); logger.error("统计数据表错误:", e); logInfoService.save("统计数据表sql执行错误:" + dbInfo.getAliasName(), "数据库别名:" + dbInfo.getAliasName() + ",数据表别名:" + dbTable.getRemark() + ",错误信息:" + e.toString(), StaticKeys.LOG_XTCZ); return 0; } } }