一. java 代码:
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 :还有很大的优化空间,
1. 把所有的设置改成读取相对路径下的config 文件,那所有的设置可以通过更改config 文件更改;
2. kill session 的语句,不需要导出到文件,直接通过jdbc循环执行即可)
这个config 文件只能放在src的目录下
二. 整个java项目导出成jar
1. 选择导出runable jar ,直接导出jar file 可能不包括jar import 的jar 包
2.导出选项
3.用cmd 尝试运行jar 包
cmd 到jar 包目录,然后 java -jar killsession.jar
三. 生成可执行exe 文件
(注:只是exe ,要在java 对应版本的jdk环境下才可以执行)
1. 下载安装最新版本的exe4j
目前java的环境是 jdk 1.8 所以下载的exe4j 也要是可以在这个版本运行的才可以用
2. 选择"JAR in EXE "mode
3. 设置输出路径和应用简称
4.设置应用基本属性
(注:ico 文件一定要原生态ico 文件,不可以由其他文件更改后缀改变的,可以通过ps 做一个出来)
64位的执行环境;
5. 设置编码方式,执行路径,执行main 方法的class
设置编码格式为UTF-8, 输入内容是:-Dfile.encoding=utf-8
6.设置程序运行时需要的jre 版本范围,设置jre 相对路径
由于创建的exe 需要在jvm 上运行, 用户只能安装jdk非常麻烦. 可以打包jre 文件成为可安装的exe 就比较方便
7.选择程序执行时,会显示在桌面的图标
8. 后面全部点next 即可
四. 生成可安装的exe,方便部署在没有安装jdk 的电脑
1.安装Inno setup 软件
2. 准备一下项目在一个文件夹里面
如这里的 SessionMrg, 等下要添加整个文件夹
3. 运行Inno setup 创建一个项目
4. 录入安装后自动创建的文件名, 版本 , 公司信息
5. 添加需要运行的exe ,以及jre
6.安装时,会创建开始菜单和桌面的快捷方式
7.录入三个空的txt
(ps: 理论上会有用途)
8. 设置语言
9. 可安装exe 一些设置
10. 点yes
11. 点是
12. 点否
开始
参考网站: https://www.cnblogs.com/lsy-blogs/p/7668425.html
来源:oschina
链接:https://my.oschina.net/u/3556610/blog/1838553