之前出现的一个系统句柄数用完的bug,故障原因应该是filepool的一个bug:
dao使用了filepool,设置为1000个大小。
然后频繁更新数据库,写入比较大的字段。1000个用完后,会重复再用第一个文件,此时第一个文件句柄还被持有,但是又被写入了内容。造成句柄不能释放,这样句柄越来越多,直到系统句柄数到达上限。
建议:filepool 能有释放机制,未释放的文件不能再被重新创建。
之前出现的一个系统句柄数用完的bug,故障原因应该是filepool的一个bug:
dao使用了filepool,设置为1000个大小。
然后频繁更新数据库,写入比较大的字段。1000个用完后,会重复再用第一个文件,此时第一个文件句柄还被持有,但是又被写入了内容。造成句柄不能释放,这样句柄越来越多,直到系统句柄数到达上限。
建议:filepool 能有释放机制,未释放的文件不能再被重新创建。
首先, 原本是1000, 新版是20w了
然后呢, 句柄泄漏应该是 open-close 没有成对操作. windows下文件只能打开一次(非share模式的话), linux下可以N次, 但句柄的open-close跟打开的次数没有关系, 写不写数据也没有关系. Dao接口内对filepool中文件的open-close是成对的.
所以, 如果说句柄泄漏了, 很大的可能性是你的代码在操作file期间报错了, 例如这样的代码
try {
InputStream in = new FileInputStream(file);
// ... ...
//期间报错
// ... ...
in.close(); // 中途报错就没执行close,导致句柄泄漏.
} catch(e){}
改成这样可避免
InputStream in = null;
try {
in = new FileInputStream(file);
// ... ...
//期间报错
// ... ...
} catch(e){}
finally {
Streams.safeClose(in); // 确保总是能执行
}
我的建议就是