`
ducaijun
  • 浏览: 155401 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate 执行原生sql或存储过程数据库连接问题

阅读更多

最近项目出现个问题,就是tomcat跑一段时间就会假死,页面能打开但是无法登陆,经过定位发现是数据库连接池满了,因为我之前hibernate用得不多,所以就写了几个测试代码来验证下哪种情况导致的。数据库持久层用的hibernate,所以只有执行原生sql和存储过程时会手动获取连接,那么问题应该就是出现在这些地方,但是之前没有出现问题,为什么现在出问题了呢?还是先写验证测试先,项目获取数据库连接获取用了三种:

①、

ConnectionProvider cp = ((SessionFactoryImplementor) this.getSessionFactory()).getConnectionProvider();
Connection conn = cp.getConnection();

 

②、

Session session = this.getSessionFactory().openSession();
Connection conn = session.connection();

 

 

③、

Session session = this.getSessionFactory().getCurrentSession();
Connection conn = session.connection();

 经过测试发现:

①这种方式获得数据库连接后,如果不手动关闭则会一直占用,必须调用conn.close()或者cp.closeConnection(conn)手动释放数据库连接。

 

②这种方式获得的数据库连接,也必须要手动关闭,否则也是会一直占用,但是关闭数据库连接不是conn.close()而是session.close()

 

 

③这种方式获得的数据库连接,可以不需要手动关闭,在程序执行完成之后会自动释放数据库连接

 

之前跑得正常的程序为什么这几天出现为问题了呢,然后看了一下最近的svn提交版本,发现打开了一个定时器,每天调用存储过程一次,这里却未关闭数据库连接。立马修正,测试,搞掂。

 

后来想想之前就好好的 为啥这里会有问题呢?对比了下代码原来这里用得是openSession而其他地方用的是getCurrentSession,然后google了下getCurrentSession和openSession的区别发现:

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

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

 

怪不得之前不会占满数据库连接池,原来是用得是getCurrentSession,即使不手动关闭也没关系。

又长点知识,特此mark一下。

分享到:
评论

相关推荐

    SpringBoot项目整合MyBatis连接数据库

    比如,刚开始学习Java的时候可能会遇到JDBC,它是连接Java和数据库的桥梁,我们可以使用JDBC来建立与数据库之间的连接并且执行相应的SQL语句。虽然JDBC的执行效率很高,但是其开发效率比较低。正是如此,市面上出现...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    Hibernate实战(第2版 中文高清版)

     15.2.3 Java Persistence中的原生SQL   15.3 过滤集合   15.4 高速缓存查询结果   15.4.1 启用查询结果高速缓存   15.4.2 理解查询高速缓存   15.4.3 什么时候使用查询高速缓存   15.4.4 自然标识符...

    Hibernate+中文文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    hibernate3.2中文文档(chm格式)

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    HibernateAPI中文版.chm

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    Mybatis框架基础

    在原生的Java技术中,需要使用JDBC实现对数据库中的数据访问,执行过程繁琐且相对固定,使用框架可以有效的提高开发效率!此文件包含Mybatis的配置流程! MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 ...

    Hibernate中文详细学习文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    Hibernate 中文 html 帮助文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    最全Hibernate 参考文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    hibernate 体系结构与配置 参考文档(html)

    使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    Hibernate教程

    11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...

    hibernate3.04中文文档.chm

    11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...

    Hibernate3+中文参考文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    hibernate 框架详解

    使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...

    Hibernate3的帮助文档

    详细的Hibernate3的帮助文档 前言 ...11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象

    Hibernate参考文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    sqltoy-orm框架系统-其他

    6、提供行列转换(数据旋转),避免写复杂的sql或存储过程,用算法来化解对sql的高要求,同时实现数据库无关(不管是mysql还是sqlserver) 7、提供分组汇总求平均算法(用算法代替sql避免跨数据库语法不一致) 8、分库分表...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题27.mysql数据库最大连接数 Java面试题28.mysql和oracle的分页语句 Java面试题29.触发器的使用场景? Java面试题30.存储过程的优点 Java面试题31.jdbc调用存储过程 Java面试题32.简单说一下你对jdbc的理解 ...

    Apache ShardingSphere分布式数据库中间层生态圈-其他

    Apache ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。它通过关注不变,进而抓住事物本质。关系型数据库当今依然...

Global site tag (gtag.js) - Google Analytics