情况是我在DAO里写了个方法调用存储过程,逻辑一切都没问题,可多次读取数据后,就会发现无法正常从数据库中得到数据了。
比如说我调用了3次存储过程这个方法,这个时候在去访问数据库,那么会一直等待,N久没有返回结果,只有重启tomcat才恢复正常,但访问几次存储过程就又完蛋了,访问其他任何dao读取数据都没问题。
public List<MessageThreadEntity> FindMessageThread(int uid, int status) {
Query query = this.getSession().createSQLQuery(
"exec view_message_thread " + uid + "," + status);
List sqlList = query.list();

List<MessageThreadEntity> mtList = new ArrayList<MessageThreadEntity>();
for (int i = 0; i < sqlList.size(); i++) {
Object[] objArr = (Object[]) sqlList.get(i);
MessageThreadEntity temp = new MessageThreadEntity();
temp.setTid(Integer.parseInt(objArr[0].toString()));
temp.setUid(Integer.parseInt(objArr[1].toString()));
temp.setFuid(Integer.parseInt(objArr[2].toString()));
if (objArr[3] != null)
temp.setNickname(objArr[3].toString());
if (objArr[4] != null)
temp.setHeadImage(objArr[4].toString());
else
temp.setHeadImage("/images/defaultHead.gif");
if (objArr[5] != null)
temp.setSubject(objArr[5].toString());
if (objArr[6] != null)
temp.setContent(objArr[6].toString());
if (objArr[7] != null)
temp.setLastMessageTime(objArr[7].toString());
if (objArr[8] != null)
temp.setCtime(objArr[8].toString());
mtList.add(temp);
}
return mtList;
}
这个是DAO中的调用存储过程代码
--获取用户的消息列表
--@uid 用户编号
--@status 待获取的消息状态 0全部消息 1已读消息 2未读消息
create procedure view_message_thread(@uid int,@status int)
as
--获取全部消息
if @status=0
begin
select t.tid,t.uid,t.fuid,u.nickname,u.headimage,t.subject,t.ctime from message_thread t,user_virtualinfo u
where t.uid=@uid and t.fuid=u.uid
order by t.ctime desc
end
else
--获取已读消息
if @status=1
begin
select t.tid,t.uid,t.fuid,u.nickname,u.headimage,t.subject,t.ctime from message_thread t,user_virtualinfo u,message_news new
where t.uid=@uid and t.fuid=u.uid and t.tid=new.tid
order by t.ctime desc
end
else
--获取未读消息
if @status=2
begin
select t.tid,t.uid,t.fuid,u.nickname,u.headimage,t.subject,t.ctime from message_thread t,user_virtualinfo u
where t.uid=@uid and t.fuid=u.uid and t.tid not in(select tid from message_news where uid=@uid)
order by t.ctime desc
end
go
这部分是存储过程代码谢谢各位帮帮忙看看哪里有问题

解决方案 »

  1.   

    使用session中的原始连接以jdbc的方式执行存储过程,你的连接释放可能不同步。或是连接阻塞什么的吧!
      

  2.   

    加入个C3P0连接池
    在hibernate.cfg.xml中加入 
    <property name="c3p0.min_size">5</property> 
    <property name="c3p0.max_size">30</property> 
    <property name="c3p0.time_out">1800</property> 
    <property name="c3p0.max_statement">50</property> 
      

  3.   

    我最近也碰到类似的问题,但不是调用存储过程,而是执行SELECT COUNT(*)。每次查了大概4、5遍之后,程序一执行到query.list()的时候,就堵在那里不往下执行了。现在还没找到原因
      

  4.   

    <property name="Pool.MaximumActiveConnections" value="100"/>
    <property name="Pool.MaximumIdleConnections" value="15"/>
    <property name="Pool.MaximumCheckoutTime" value="120000"/>
    <property name="Pool.MaximumWait" value="1000"/>
    <property name="Pool.TimeToWait" value="500"/>
      

  5.   

    我的问题找到原因了, 是我在Dao方法里多次调用getSession(),但是只关闭了一次。导致org.apache.common.pool.GenericObjectPool类里发生了线程死锁。我看楼主的代码也是session没有关闭, 应该问题也在这里。