package sessionMrg; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import org.apache.commons.logging.*; import java.sql.SQLException; import java.util.Properties; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.Statement; public class SessionMrg { // JDBC 驅動名及數據庫URL private static String driver ; private static String url ; // 數據庫的用戶名和密碼 private static String username ; private static String password ; // 定義數據庫連接 private static Connection conn = null; // 定義sql語句執行對象 private PreparedStatement pstmt; // 定義查詢返回的結果集合 private ResultSet rs; //定義路徑 private static String filepath="D:/MySQL/a.sql"; //定義睡眠時間 private static int sleepTime = 600000; private static Log log = LogFactory.getLog(SessionMrg.class) ; /** * 經過靜態代碼塊加載DBHelper.properties */ static{ loadConfig(); } /** * 加載數據庫配置信息DBHepler.properties,並給相關的屬性複製 */ public static void loadConfig(){ try { InputStream inStream =SessionMrg.class.getResourceAsStream("/config/DBHelper.properties"); Properties prop=new Properties(); prop.load(inStream); username=prop.getProperty("DBHelper.username"); password=prop.getProperty("DBHelper.password"); driver=prop.getProperty("DBHelper.driver"); url=prop.getProperty("DBHelper.url"); System.out.println(url); System.out.println(password); } catch (Exception e) { log.info(e.getMessage()); //建議將異常信息經過throw的拋給調用者處理 throw new RuntimeException("讀取數據庫配置文件異常!",e); } } /** * 獲取數據庫連接 * * @return 數據庫連接 */ public Connection getConnection() { try { Class.forName(driver); conn = DriverManager.getConnection(url, username, password); } catch (Exception e) { log.info(e.getMessage()); } return conn; } /** * 釋放資源 * @param args */ public void releaseConn(){ if(rs !=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block log.info(e.getMessage()); } } if(pstmt !=null){ try { pstmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block log.info(e.getMessage()); } } if(conn !=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block log.info(e.getMessage()); } } } /** * 刪除文件 * @param args */ public static void deleteFile(String sPath) { File file = new File(sPath); // 路徑爲文件且不爲空則進行刪除 if (file.isFile() && file.exists()) { if(file.delete()){ log.info("文件被刪除,能夠繼續執行"); System.out.println("文件被刪除,能夠繼續執行"); } else{ System.out.println("文件刪除失敗,程序必定報錯"); log.info("文件刪除失敗,程序必定報錯"); } } else{ System.out.println("文件不存在,繼續執行"); log.info("文件不存在,繼續執行"); } } /** * kill sessions * @param args */ public static void KillSession(){ try { Connection conn = new SessionMrg().getConnection(); if (conn != null) { System.out.println("數據庫連接正常!"); log.info("數據庫連接正常!"); } else { System.out.println("數據庫連接異常!"); log.info("數據庫連接異常!"); } deleteFile(filepath); //打開鏈接 Statement stmt =null; stmt =(Statement) conn.createStatement(); String sql; sql = "select concat('KILL ',id,';') from information_schema.processlist where command ='Sleep' and TIME > 1000 into outfile '"+filepath+"';"; ResultSet rs = stmt.executeQuery(sql); System.out.println("生成a.sql"); log.info("生成a.sql"); rs.close(); //按行讀取文件 //BufferedReader是能夠按行讀取文件 FileInputStream inputStream = new FileInputStream(filepath); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String sql2 = null; ResultSet rs2 = null ; while((sql2 = bufferedReader.readLine()) != null) { rs2 = null; rs2 = stmt.executeQuery(sql2); System.out.println(sql2); log.info(sql2); } if (rs2!=null){ rs2.close(); }else{ System.out.println("沒有線程須要刪除"); log.info("沒有線程須要刪除"); } bufferedReader.close(); stmt.close(); conn.close(); } catch (Exception ex) { // TODO Auto-generated catch block log.info(ex.getMessage()); } } /** * 每10分鐘kill 一次線程 * @param args */ public static void killSessionByTime(){ while(true){ try { KillSession(); Thread.sleep(sleepTime); } catch (InterruptedException e) { log.info(e.getMessage()); } } } public static void main(String[] args) { killSessionByTime(); } }
(ps :還有很大的優化空間,html
1. 把全部的設置改爲讀取相對路徑下的config 文件,那全部的設置能夠經過更改config 文件更改;java
2. kill session 的語句,不須要導出到文件,直接經過jdbc循環執行便可)mysql
這個config 文件只能放在src的目錄下sql
cmd 到jar 包目錄,而後 java -jar killsession.jar數據庫
目前java的環境是 jdk 1.8 因此下載的exe4j 也要是能夠在這個版本運行的才能夠用apache
(注:ico 文件必定要原生態ico 文件,不能夠由其餘文件更改後綴改變的,能夠經過ps 作一個出來)session
64位的執行環境;jvm
設置編碼格式爲UTF-8, 輸入內容是:-Dfile.encoding=utf-8優化
因爲建立的exe 須要在jvm 上運行, 用戶只能安裝jdk很是麻煩. 能夠打包jre 文件成爲可安裝的exe 就比較方便網站
如這裏的 SessionMrg, 等下要添加整個文件夾
(ps: 理論上會有用途)
開始