把<prop key="hibernate.connection.release_mode">${hibernate.connection.release_mode}</prop>去掉试试

解决方案 »

  1.   

    wangzhouyu(小小) 谢谢你的关注!以前是没有加这个属性的,但查找大量资料后发现了有一个自动释放连接的参数,我就加了,${hibernate.connection.release_mode的值我设的是after_transaction 事务完成后就自动释放连接。虽然不设的话,默认是auto,hibernate自己根据情况设置,但是也没用。还有,我这是用的dbcp的连接池,我本来是想用c3po的,因为看文档说hibernate推荐c3po,但是我用它的时候,服务器启动后就不停地在配置文件打这个出来:
    Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@20f237 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@1716fa0 [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, idleConnectionTestPeriod -> -1, initialPoolSize -> 15, maxIdleTime -> 10, maxPoolSize -> 1000, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 10, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@18b1f8f [ description -> null, driverClass -> com.microsoft.sqlserver.jdbc.SQLServerDriver, factoryClassLocation -> null, jdbcUrl -> jdbc:sqlserver://localhost:2869;instanceName=SQL2005;databasename=survey, properties -> {user=******, password=******} ] , preferredTestQuery -> null, propertyCycle -> 300, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, usesTraditionalReflectiveProxies -> false ] , factoryClassLocation -> null, numHelperThreads -> 3, poolOwnerIdentityToken -> 20f237 ] ............
    很多很多,不停地初始化,我也不知道是为什么。
      

  2.   

    按照Hibernate的介绍,sessionFactory只初始化一次,连接池中的connection可重用,但是为什么我的每次都重新新建sessionFactory这个没有错的,你的每个dao执行的时候都是new了一个新的sessionFactory。所以不停的连接。我一般是建立一个HibernateListener,在工程启动的时候,连接 建立sessionFactory。以后每个dao就不需要重新连接了。这样就是启动建立sessionFactory的时候速度慢,但是使用dao就快了,因为不需要重新连接。
      

  3.   

    HibernateListener :
    public class HibernateListener implements ServletContextListener {    private static Logger log = Logger.getLogger(HibernateListener.class);    
        public void contextInitialized(ServletContextEvent event) {
            log.info("Starting Hibernate persistence service...");
            HibernateSessionFactory.currentSession(); // Just call static initializer
            log.info("Hibernate startup complete");
        }    public void contextDestroyed(ServletContextEvent event) {
            log.info("Shutting down Hibernate persistence service...");
            HibernateSessionFactory.closeSession();
            log.info("Hibernate shutdown complete");
        }
    }web.xml:   <listener>
    <listener-class>com.test.common.hibernate.HibernateListener</listener-class>
       </listener>DAO:
            Session session = currentSession();   //HibernateSessionFactory.currentSession();   不需要每次新建立连接HibernateSessionFactory了
            Transaction t = session.beginTransaction();
      

  4.   

    很感谢SDMRauquin(冷月无心) ,不管是否可以,我还是会试一下你的方案的!
    但实际上我并没有在DAO里重新建SessionFactory,我的DAO里是
    Session session = this.getSession();而且我现在在测试的时候仅仅只是用了Hibernate自带的hql语句和HibernateTemplate,并没有用到JDBC自己建连接:
    Session session = this.getSession();
    Connection conn = session.connection();
    比如说获得所有要发的邮件:
    public List getAllMailTask() { try {return (List) this.getHibernateTemplate().execute(
    new HibernateCallback() {
    public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    Query query = session.createQuery("FROM MailTask ");
    List list=query.list();
            return list;
    }
    }
    );}catch(Exception e){
    e.printStackTrace();
    return null;
    }
    }
      

  5.   

    SDMRauquin(冷月无心)  还有就是我想问一下,如果你自己初始化sessionFactory的话,Spring就不会管你的session了,我看你的HibernateListener中有contextDestroyed()关闭session的,是不是你在每个事务提交后都需要手动关闭session,也就是调用contextDestroyed()呢。
      

  6.   

    我用spring的话,我也是用c3po的在beam.xml:
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>WEB-INF/classes/hibernate.cfg.xml</value> //就是单独使用hibernate的配置
    </property> 

    <!-- 为处理Blob类型字段的句柄声明-->
    <property name="lobHandler" ref="lobHandler"/>

    </bean><!-- DaoTraget>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-->
    <bean id="expoPurchTopicDaoTarget" class="org.caexpo.hibernate.dao.impl.ExpoPurchTopicDAO">
    <property name="sessionFactory">
      <ref bean="sessionFactory"/>
    </property>
    </bean>
      

  7.   

    DAO: 
    ... ...
            Session session = currentSession();
            Transaction t = session.beginTransaction();
    ... ...
            session.save(expert);
            session.flush();         
            t.commit();        
            closeSession();   //HibernateSessionFactory.closeSession()
    ... ...contextDestroyed并不是在一个dao结束的时候调用的.contextInitialized和contextDestroyed是根据服务的启动而启动或者关闭的
      

  8.   

    经过一天的debug,终于发现了问题,是我自己无意中又初始化了sessionFactory
    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
    new String[] {GlobalVar.APPCONETN_URL});
    GlobalVar.APPCONETN_URL =WEB-INF/ApplicationContext.xml我把它放在定时发送邮件的函数中,所以每隔一段时间都会新建连接(池),呵呵!但是我又出现了一个问题,我需要获得ApplicationContext.xml中己经注册了的bean,我在另一个类中定义一个静类变量来接收它的值。我用了 获得spring里注册Bean的方法:http://blog.chinajavaworld.com/entry.jspa?id=500
    的第二种,但是获得的
    在 UserService userService = (UserService)service.getService("userService");返回的userService 是null,为什么我不能用呢。可以帮忙看看吗?谢谢