kongdeqiang
2023-05-11 d4e6ec0389dd8abbcce4ee4f9e5cdad1633491d5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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<Map<String, Object>> list = jdbcTemplate.queryForList(dbTable.getWhereVal());
            if (CollectionUtil.isEmpty(list)) {
                return 0;
            } else {
                //取第一行
                Map<String, Object> 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;
        }
    }
 
}