扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
关于linkedList百思不得其解的问题
我有一段这样的代码:
Java codeprivate LinkedList<Connection> freeCon = new LinkedList<Connection>();
public Connection getConn()
{
Connection re = null;
if(freeCon.size()>0)
{
re = freeCon.getFirst();
freeCon.removeFirst();
try {
if(re.isClosed())
{
this.getConn();
}
} catch (SQLException e) {
e.printStackTrace();
}
}else{
re = this.getConnByDateSource();
}
return re;
}
此代码有时会出现java.util.NoSuchElementException
java.util.LinkedList.remove(Unknown Source)
java.util.LinkedList.removeFirst(Unknown Source)
dlp.oa.sql.SqlOracle.getConn(SqlOracle.java:117)
这个异常不常发生,一般好几天发生一次,让我感到很奇怪的就是,re = freeCon.getFirst();没有出现NoSuchElementException为什么freeCon.removeFirst();会发生异常呢.看那个高手能道出个原因出来. 此错误重启tomcat就好了.
楼主是想模拟数据库连接池把??
出现这个异常时因为freeCon.getFirst();值为空
肯定是楼主释放掉资源没有把资源放入连接池中,刚开始启动的时候比如有20个连接吧,
用过释放掉,你用过20个之后,连接池中的connection就空了,所有报了这个异常.
楼主释放资源的代码有问题.自己看看,是不是没把connection放回连接池中
public Connection getConn()
方法没有同步,导致两个线程同时进入此方法了
结果线程一在运行re = freeCon.getFirst();之后,可能时间片用完了,暂时停止运行。
这个时候线程二进入了这个方法,同时运行了removeFirst了。
然后线程一继续运行时removeFirst就报错了
所以你的getConn必须增加同步声明
你这个异常我用List的时候也出现过,不知道情形是否相同
解决方法是
不要用你list对象直接去remove
而是用Iterator遍历
然后用Iterator对象去remove
for (Iterator it = list.iterator(); it.hasNext();) {
Object o=it.next();
if(条件){
it.remove();
}
}
说不出原因来,但的确能解决
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者