1. 程式人生 > >java實現線上停止JDBC中SQL查詢

java實現線上停止JDBC中SQL查詢

實現思路解析: 

維護一個Map<jobID, 連線物件>

jobID 這裡作為唯一的ID,

連線物件每次生成即可儲存,結束查詢後刪除即可。

當想停止jobID = 1的JDBC連線,

我們只需要在Map中找到jobID = 1,然後取出連線物件,使用

conn.close() 即可中斷查詢服務。

程式碼部分:

維護Map部分程式碼:

import com.google.common.collect.Maps;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.sql.Connection;
import java.util.Map;

/**
 * 連線執行緒池管理
 */
public class ConnectUtil {

    private static Log LOG = LogFactory.getLog(ConnectUtil.class);

    // 維護一個Map<jobID, ConnectionObj>
    public static Map<String, Connection> connectionMap = Maps.newHashMap();

    /**
     * 刪除連線物件
     * 根據傳入的key -> jobID,刪除佇列中的元素
     * @param map
     * @param key
     * @return
     */
    public static Map<String, Connection> reConnectObj(Map<String, Connection> map, String key) {
        if (ConnectUtil.connectionMap.containsKey(key)) {
            map.remove(key);
        } else {}
        return map;
    }
}


新增

Class.forName(Constant.HiveDriver);
            conn = DriverManager.getConnection(
                    configUtil.readConfig("hive.host.url"),
                    configUtil.readConfig("hive.username"),
                    configUtil.readConfig("hive.password"));
            // 維護資料庫連線物件Map
            ConnectUtil.connectionMap.put(jobID, conn);
            stmt = conn.createStatement();
            resultSet = stmt.executeQuery(sql);

清除

                // 移除已結束的連線物件
                ConnectUtil.reConnectObj(ConnectUtil.connectionMap, jobID);

停止

@Override
    public String StopOnlineQuery(String jobID) {
        try {
            ConnectUtil.connectionMap.get(jobID).close();
        } catch (Exception error) {
            error.printStackTrace();
            return "Kill失敗";
        }
        // Kill後刪除連線物件
        ConnectUtil.reConnectObj(ConnectUtil.connectionMap, jobID);
        Map<String, Object> mapParam = Maps.newHashMap();
        mapParam.put("dataPath", "");
        mapParam.put("logPath", "");
        mapParam.put("endTime", dateTimeUtil.timeStampToDateTime(dateTimeUtil.currentTimeStamp()));
        mapParam.put("usedTime", "");
        mapParam.put("failedCause", "killed");
        mapParam.put("status", "Killed");
        mapParam.put("jobID", jobID);
        onLineQueryMapper.updateQueryLog(mapParam);
        return "Kill 成功";
    }