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: 理论上会有用途)
开始