java實現線上停止JDBC中SQL查詢
阿新 • • 發佈:2018-11-28
實現思路解析:
維護一個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 成功"; }