免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3460 | 回复: 0
打印 上一主题 下一主题

Hibernate + Spring 解决 opening JDBC connection 停住的问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-03 09:28 |只看该作者 |倒序浏览
  
最近在用 HIBERNATE,全面向对象,挺方便的。但也有些不方便的地方,可能是自己不够精通的缘故,所以出现了很多问题。

下面说说过程吧,我用的是 MyEclipse6.0,要配合 Eclipse3.3 使用,里面自带 Hibernate 插件。安装就不说了,不过不知为什么,插件比较容易出问题,安装完 MyEclipse6.0 后就有时做 Hibernate 反向工程时报错,遇到这种问题时我总是重装解决。

Hibernate 反向工程的使用方法在 MyEclipse 自带的帮助里就有。帮助里不只有一步一步的操作说明,而且还有 Flash 操作动画,我就是参照上面的操作自动生成了 Hibernate 的框架代码,能生成实体类和DAO类,也可以生成HIBERNATE 的配置文件和各个类的配置文件,很方便,但一般需要根据自己的需求改一些配置。生成的代码是由 spring 实例化的,包括连接池什么的。

顺便说一句,实际 MyEclipse 的帮助里有很多东西,包括 WebService 插件(可以生成WEBSERVICE代码,布署等等);Ajax 插件 ATF(AjaxTookitFramework),里面有DEBUG AJAX代码的工具,像FF里面的一样。

刚才扯得有点远,还是看问题吧:需求是这样的,我要开发一个分页查询的东东,但自动生成的代码里没有分页查询的东西,只能自己写一个方法来实现功能。在网上查了一下,Query 里有 setFirstResult(int) 和 setMaxResults(int) 两个方法,就是取从第 firstResult 到第 maxResult 行的数据。于是我写了如下代码类:

public class SerialNumberDAO extends HibernateDaoSupport
{
    public list query(SerialNumber sn)
    {
        Session session;
        Query query;
        try
        {
         session = this.getSession();
         // Transaction tx = session.beginTransaction();
         query = this.getSession().createQuery("select count(*) from SerialNumber");
         sn.setSumRecords(((Integer)query.uniqueResult()).intValue());
         query = this.getSession().createQuery("from SerialNumber");
         query.setFirstResult(sn.getFrom());
         query.setMaxResults(sn.getTo());
         List  SerialNumber > list = query.list();
         // tx.commit();
         return list;
        }
        catch (RuntimeException re)
        {
         log.error("find by property name failed", re);
         throw re;
        }
        /*
        finally
        {
         this.getSession().clear();
         this.getSession().close();
         this.getSessionFactory().close();
        }
        */
    }
}

程序在运行几次之后,就会再无反应,查看调试日志,发现最后会打出如下日志:
[org.hibernate.jdbc.ConnectionManager]-[DEBUG] opening JDBC connection

打完这条就不再打了,明显是数据库连接问题。于是在 MySQL 中查询进程列表 show processlist; 发现当运行这段程序时,进程列表就会加一条记录,运行其它程序则不会。我用的是 commons-dbcp 连接池,肯定不是连接池的问题,因为其它程序没有问题;那肯定是我这段程序没有释放连接。

在网上找了一下,有人说是因为没有提交事务的原因,于是加上了上面被我用 // 注释掉的两句,没有好转。还有人说是 session 没有关闭导致连接没关,于是我又加上了 finally 这段,问题依旧。这个怎么办?
于是看了一下其它方法的实现方式,也看了一些 Spring 的一些原代码,里面是用的 HibernateTemplate 的 find 一些方法做的,没有关于分页查询的。所有的 find 方法里调用的 execute(HibernateCallback action, boolean exposeNativeSession) 方法,我查了一下,HibernateTemplate 里面有这个方法,我照着实现就行了。于是写出了这样的代码:

public class SerialNumberDAO extends HibernateDaoSupport
{
public list query(final SerialNumber sn)
{
int i = (Integer) this.getHibernateTemplate().find("select count(*) from SerialNumber").iterator().next();
sn.setSumRecords(i);
ListSerialNumber> list = (ListSerialNumber>) this.getHibernateTemplate().execute(new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException
{
Query queryObject = session.createQuery("from SerialNumber");
queryObject.setFirstResult(sn.getFrom());
queryObject.setMaxResults(sn.getTo());
return queryObject.list();
}
}, false);
return list;
}
}

明显是 Spring 的风格^_^,问题解决!

随然解决了问题,但还是不知道以第一段代码的方式如何解决问题。希望高人指点。。。。。。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/10921/showart_1676554.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP