NutzCN Logo
问答 filepool疑似的bug
发布于 3024天前 作者 for5million 2135 次浏览 复制 上一个帖子 下一个帖子
标签: filepool

之前出现的一个系统句柄数用完的bug,故障原因应该是filepool的一个bug:
dao使用了filepool,设置为1000个大小。
然后频繁更新数据库,写入比较大的字段。1000个用完后,会重复再用第一个文件,此时第一个文件句柄还被持有,但是又被写入了内容。造成句柄不能释放,这样句柄越来越多,直到系统句柄数到达上限。

建议:filepool 能有释放机制,未释放的文件不能再被重新创建。

2 回复

首先, 原本是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); // 确保总是能执行
}

我的建议就是

  • 修改文件池大小到足够用
  • 检查上述的open-close成对问题
添加回复
请先登陆
回到顶部