这个一般会出现在连接池中,导致连接池数量不够然后连接失败,所以要kill
我们kill的都是sleep的,就是没有释放但是不用的链接
前言
sql中的show full processlist是查看线程,实际就是查这个表
select * from information_schema.processlist where COMMAND = 'Sleep' and Time>30
然后在配上kill id,就能释放,为了以后方便寻找,我把他写成了接口,我通过shell脚本的curl 调用这个接口,就能实现轮询释放。
代码实现
controller层代码
@GetMapping("kill")
public RsJsonBean killProcess(@Param("key") String key) {
SqlSession mybaiteSession = null;
try {
if (key.equals("#sdfada!")) {//密钥,当这个成立时,则会释放所有线程,腾出空间
mybaiteSession =DBCPUtil.getMybaiteSession();
infoMapper = mybaiteSession.getMapper(InfoMapper.class);
List<HashMap> hashMaps = infoMapper.selectProcess();
for (int i = 0; i < hashMaps.size(); i++) {
HashMap hashMap = hashMaps.get(i);
int id =Integer.parseInt(hashMap.get("ID").toString());
infoMapper.killProcess(id);
}
mybaiteSession.commit();
return new RsJsonBean(1, "成功释放");
}
//密钥不匹配
return new RsJsonBean(0, "释放失败:" + "密钥不匹配");
} catch (Exception e) {
return new RsJsonBean(0, "释放失败:" + e.getMessage());
} finally {
if (mybaiteSession != null) {
mybaiteSession.close();
}
}
}
mybaites代码,sql
//查询所有符合条件的线程 List<HashMap> selectProcess(); //释放某个线程 int killProcess(@Param("id") int id);
<select id="selectProcess" resultType="java.util.HashMap">
select * from information_schema.processlist where COMMAND = 'Sleep' and Time>15
</select>
<delete id="killProcess">
kill #{id}
</delete>
shell脚本
通过curl方式的特殊字符不能用。
curl -XGET http://127.0.0.1:8087/info/kill?"key=23aoTest"
-XGET代表get请求,crul中参数拿""标起来
#!/bin/bash
while true
do
echo "开始,请等待5秒"
sleep 5s
echo `curl -XGET http://127.0.0.1:8087/info/kill?"key=23aoTest"`
echo `date`
echo "-----"
done