c3p0数据库连接池问题-----不能取到连接An attempt by a client to checkout a Connection has timed out(问题还没有解决)

来源:互联网 发布:图像边缘检测各种算法 编辑:程序博客网 时间:2024/05/18 09:23

总结:

1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。

2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭

-----------------------------------------------------------------------

获取Session方式的优劣比较:

1.getHibernateTemplate().getSessionFactory().openSession();

  通过这种方式打开的session不会自动关闭,现象时查询多次之后连接池满了,不会再继续查询了.需要手动关闭连接
2.this.getSession;实际上是调用了父类中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一session.这样做有可能有问题,就是超session池连接数的时候,spring无法自动的关闭session。 不推荐使用

3.this.getHibernateTemplate().getSessionFactory().getCurrentSession();从spring管理的sessionFactory中创建一个绑定线程的session.spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。 极力推荐使用这种方法 

--------------------------------------------------------------------------------

getCurrentSession()和openSession()在使用时的区别:

1.采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会

2. 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭

   (getCurrentSession()创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭)

3.getCurrentSession () 使用当前的session,而openSession() 重新建立一个新的session 

在一个应用程序中,如果DAO 层使用Spring 的hibernate 模板,通过Spring 来控制session 的生命周期,则首选getCurrentSession ()。

-------------------------------------------------------------------------------

使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:

1.如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
2.如果使用的是全局事务(jta事务)

<property name="hibernate.current_session_context_class">jta</property>

---------------------------------------------------------------------

问题:(以下问题还没有解决)

1.c3p0数据库连接池不能取到连接:An attempt by a client to checkout a Connection has timed out.异常时

根本原因: 池中的连接已经被全部使用完了..达到了最大maxconn...从而导治这个错误...
其他原因:忘记close conn,或者异常了而没有close conn,没有释放conn从池中。。...导治池中的conn满的了...

也可以认为connection没有及时释放;connection泄露问题
2.什么情况下或什么操作会导致程序运行时从数据库连接池中去获取连接?又是什么情况程序会自动释放连接?
在项目中使用c3p0数据库连接池时我没有进行数据库连接释放的操作行为语句(即connection.close()语句显示关闭连接),那在使用getCurrentSession创建hql语句执行对象Query,在hql执行结束后会自动释放连接吗?
一个Query用来执行一条hql语句,同时会占用一个数据库连接Connection吗?


0 0
原创粉丝点击