您的位置:首页 > 数据库

项目报错:打开文件过多,数据库连接失败等资源问题

2017-05-07 00:00 405 查看
背景:公司一java工程,该工程中使用到了elasticsearch的客户端,自己写了一个客户端的连接池,使用的是org.apache.commons.pool.BasePoolableObjectFactory;

但是重写销毁对象的方法直接调用了super的方法(第一次用,也没看super的实现);

@Override
public void destroyObject(Client obj) throws Exception {
super.destroyObject(obj);
}


在开始量小的时候跑的很欢,因为项目不断更新,相当于不定期的重启,没什么问题。但是最新量上来之后,经常报打开文件过多的错误,并伴随着其他错误,比如数据库链接失败,httpclient报UnknownHostException等一系列关于资源的错误。

排查:使用losf命令发现该工程使用的文件句柄高达80万,已经到达系统设置打开文件上限了,所以导致文件过多,数据库链接不上等问题。在手动调高系统打开文件的数量后,发现打开文件数还在不停的上涨,所以该问题基本判定是资源文件使用但是没有释放导致,且没有可用的资源导致一系列的相关错误问题。说明代码对于资源使用存在严重没有释放调用的问题。首先找httpclient是否关闭资源,然后再查看依赖第三方的客户端是否关闭资源,就找到了es客户端连接池在销毁对象的时候只调用了super的方法,但是查看父方法的实现是空的!!!坑了,调用super的方法没用,所以这里需要对销毁的对象调用相应的关闭资源方法,不同资源关闭资源的方法不一样,我这是是es客户端对象,该对象有个close方法

@Override
public void destroyObject(Client obj) throws Exception {
super.destroyObject(obj);
obj.close();
}


抓紧修改上线。。。

总结:在实现自己的连接池的时候需要记住释放资源,并且在使用父方法的时候一定要看下实现!!确定父方法的相关逻辑是自己预期的!!!

虽然也有数据库链接不上的问题报错,但是都是因为文件打开过多,导致一系列的问题出现,并不是网络或者数据库出现问题。问题不能只看表面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  打开文件过多
相关文章推荐