请教:java.sql.SQLException: 关闭的连接

zhonghuafy 2012-08-30 11:06:48
各位大侠:我用hibernate和 oracle开发的基于apache james的邮件系统。系统部署在服务器(tomcat)上后一直运行正常。但昨天突然出现错误,用户无法登录系统。分析日志发现抛出大量java.sql.SQLException: 关闭的连接的异常。
[2012-08-27 05:40:49] com.csc.mail.jsh.db.hibernate.dao.generic.HibernateDao : [INFO ]  - [findByParameters]excute sql:from com.csc.mail.jsh.db.pojo.TblUser where fullName=? 
[2012-08-27 05:40:49] org.hibernate.util.JDBCExceptionReporter : [WARN ] - SQL Error: 17008, SQLState: null
[2012-08-27 05:40:49] org.hibernate.util.JDBCExceptionReporter : [ERROR] - 关闭的连接
[2012-08-27 05:40:49] com.csc.mail.jsh.db.hibernate.dao.generic.HibernateDao : [ERROR] - [findByParameters] error when excute sql:[from com.csc.mail.jsh.db.pojo.TblUser where fullName=? ],could not execute query,cause:java.sql.SQLException: 关闭的连接
org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2235)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
at org.hibernate.loader.Loader.list(Loader.java:2124)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.csc.mail.jsh.db.hibernate.dao.generic.HibernateDao.findByParameters(HibernateDao.java:198)
at com.csc.mail.jsh.business.service.serv.impl.UserServImpl.getUserByName(UserServImpl.java:206)
at com.csc.mail.jsh.action.UserAction.login(UserAction.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept

请问会是什么原因?我hibernate连接数据库的dao,每一次操作后面都有finally,并且在finally里面关闭连接(closeSession();)。
我的hibernate配置文件没有配置连接池。
请各位大侠不吝赐教!
...全文
3755 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fealtyjay 2013-10-11
这个好像就是最大连接数的问题,改了最大连接数就好了。oracle11g默认的最大连接数只有150。
回复
thieives 2012-10-22
[Quote=引用 8 楼 的回复:]

我也遇到这个问题,纠结了几天,最终搞定。
[/Quote]


你好,我想问下,你是如何处理的?
回复
NewMoons 2012-08-31
[Quote=引用 11 楼 的回复:]

运行几天,然后突然报错,很可能是数据库有些连接资源没有被关闭,达到了数据库的最大连接数,导致后来的请求无法连接数据库,资源耗尽,建议配置数据库连接池。要是程序的问题,即使使用连接池也会有问题的。
[/Quote]

说得对,还是仔细检查一下程序。
回复
小飞侠xiao 2012-08-30
这个有时挺难说的
回复
NewMoons 2012-08-30
如果你保证每次操作都close了,那就配置连接池吧,很可能是资源耗尽了
回复
lianxiaoye 2012-08-30
我也遇到这个问题,纠结了几天,最终搞定。
回复
zhonghuafy 2012-08-30
[Quote=引用 5 楼 的回复:]

建立连接池吧Java code

<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="300" />
<property name="maxIdleTime" value="60" />
<property name="acqu……
[/Quote]
不错的建议。先配个连接池,再跟踪几天看看。
回复
zhonghuafy 2012-08-30
[Quote=引用 4 楼 的回复:]

这个不知道跟hibernate的懒加载有没有关系?例如你查询了一个对象A,对象A里面有个属性对象B,然后你查询并关闭连接以后如果没有处理懒加载这时候调用A的B属性的某个属性就会报错了。在<class>标签中加入lazy="false"好像是,楼主网上搜索一下hibernate懒加载吧。
at org.hibernate.loader.Loader.doList(Loader.java:2235……
[/Quote]
只查询一个用户对象。都在tbl_user表里面,有userid,username,passwd等。不需要懒加载。
回复
建立连接池吧

<property name="minPoolSize" value="1" />
<property name="maxPoolSize" value="300" />
<property name="maxIdleTime" value="60" />
<property name="acquireIncrement" value="5" />
<property name="initialPoolSize" value="1" />

回复
leandzgc 2012-08-30
这个不知道跟hibernate的懒加载有没有关系?例如你查询了一个对象A,对象A里面有个属性对象B,然后你查询并关闭连接以后如果没有处理懒加载这时候调用A的B属性的某个属性就会报错了。在<class>标签中加入lazy="false"好像是,楼主网上搜索一下hibernate懒加载吧。
at org.hibernate.loader.Loader.doList(Loader.java:2235)看看这里的代码,为什么doList方法会报不能执行查询?调试一下
回复
雍寇德 2012-08-30
数据库问题。 把服务重新启动一下
回复
zhonghuafy 2012-08-30
[Quote=引用 1 楼 的回复:]

数据库停止服务了,再开启就行。可能访问数多,崩溃了吧
[/Quote]
数据库服务还是运行着的。tomcat下有三个应用使用同一个数据库。我这个邮件系统无法登录。因为是实际生产环境,应该允许几百人同时访问才是。请问如何处理大批量的数据访问请求呢?
回复
数据库停止服务了,再开启就行。可能访问数多,崩溃了吧
回复
pxxaish9527 2012-08-30
运行几天,然后突然报错,很可能是数据库有些连接资源没有被关闭,达到了数据库的最大连接数,导致后来的请求无法连接数据库,资源耗尽,建议配置数据库连接池。要是程序的问题,即使使用连接池也会有问题的。
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2012-08-30 11:06
社区公告
暂无公告