`
pretty_frog
  • 浏览: 5708 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

连接池维护心得

阅读更多
连接池连接维护心得
最近系统连接池连接出现了连接数持续上涨的问题,我们对连接池的所有的参数研究发现时代码中没有关闭连接,后来找到代码中的连接,将其关闭。先将查找心得整理如下:
我们知道连接池有removeAbandoned removeAbandonedTimeout logAbandoned这三个属性,removeAbandoned removeAbandonedTimeout 两个属性配合使用可以将指定时间内没有关闭的connection回收关闭。
设置了这几个属性后,连接池连接数的状态是这样的,如果存在没有关闭的连接,连接池会每隔removeAbandonedTimeout设置的时间,检测一下连接池的连接数和连接状态,如果当连接池中活动的连接数大于maxActive设置的最大连接数时,将会启动连接回收,这个连接回收是不会将连接回收到连接池重复利用,而是直接销毁这些连接。在这个时候连接池的连接数会突然下降至当前需要的连接,而这些连接是连接池重新产生的,不是回收利用的。
如果持续发现这种情况,而且这些连接在数据库总的状态一直是sleep状态,我个人觉得,就应该是程序中没有正常关闭连接了。我们就需要在程序中找到这个连接。恰恰连接池提供了logAbandoned属性,如果将其设置为true,那么在出现上述情况时,关闭的连接信息打印到日志,类似的打印日志如下:
DBCP object created 2011-04-14 11:22:18 by the following code was never closed:
java.lang.Exception
        at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:160)
        at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:86)
        at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
        at org.yeeda.costexpress.util.ConnectionPool.getConnection(Unknown Source)
        at org.yeeda.costexpress.service.member.impl.MyMaterialServiceImpl.exportExcel(Unknown Source)
        at org.yeeda.costexpress.servlet.member.MyMaterialServlet.toExcel(Unknown Source)
        at org.yeeda.costexpress.servlet.member.MyMaterialServlet.doPost(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.yeeda.costexpress.filter.AutoLoginFilter.doFilter(Unknown Source)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:619)


这个相当于异常处理,程序不会报错。但是我们可以通过异常信息找到到底是哪里的connection没有关闭,能够找到代码的位置,然后仔细分析代码,看从连接池的拿到的连接到底执行了close()方法没有。如果出现上述那样的情况,一般是没有关闭的。
这次通过我对源代码的分析,发现执行关闭的connection是个空值,是程序初始化是赋的值,但是真正执行任务的connection是程序员从连接池中拿的,但是并没有赋给类connection属性,但是它最后调用关闭的方法是框架里写好的,(可能是从别的地方复制过来的)但是框架写好的方法是关闭调用类得connection属性。所以这样导致了,一个空值传给关闭connection的方法,而真正从连接池拿来的connection却还在逍遥法外。
通过这样的错误,我意识到,有时候我们程序员编程,淹没在无穷的代码中,可能会很累,很烦,感觉系统框架的一些方法太麻烦,在一些应用中懒得去用,使用直接的方法还快,省事一些,但是在方法的其他地方又用了框架的东西,很多情况下,像今天这样,表面上万无一失,却真正出了问题。
我感觉我们在编程的时候,可以临时发挥,走比较有效的路线,但是如果我们的思路脱离了框架,在方法写完时,再整体检查一下,确保万无一失。
分享到:
评论

相关推荐

    SSM框架druid连接池,sql server数据库

    在SSM项目中,数据库连接管理是至关重要的,而Druid则是一个优秀的数据库连接池组件,它由阿里巴巴开源并维护,提供了强大的监控和扩展功能。 Druid连接池的主要优点包括: 1. **性能优异**:Druid经过大量的性能...

    JAVA与数据库实训项目实习感想心得体会9篇范文

    在实训项目中,我们还接触到了数据库连接池的概念,如Apache的DBCP或C3P0,它们可以有效地管理数据库连接,提高系统性能。同时,JDBC(Java数据库连接)是连接JAVA应用和数据库的重要桥梁,我们学习了如何编写DAO...

    java学习心得,笔记,思想

    学习JDBC包括理解连接池的概念、编写SQL语句、执行查询和更新操作、处理结果集等。了解事务管理和异常处理也是至关重要的,这确保了数据的完整性和一致性。 在描述中提到了"userManager",这可能是实现用户管理功能...

    设计模式学习心得(研磨设计模式)

    这种模式在需要频繁创建和销毁对象,或者对象创建代价高昂的情况下非常有用,例如数据库连接池、线程池等。实现单例模式时,需要注意线程安全问题,避免多线程环境下产生多个实例。 2. **工厂方法模式**: 工厂方法...

    Servlet+MySQL实现登录功能.zip

    连接池预先创建并维护一定数量的数据库连接,当应用程序需要时可以快速获取,用完后归还。这减少了创建和关闭数据库连接的开销。常见的连接池实现有C3P0、HikariCP、Apache DBCP等。开发者可能在项目中配置了这些...

    java中常用设计模式总结心得

    这种模式常用于配置管理、线程池或者数据库连接池等场景。实现方式有懒汉式(线程不安全)、饿汉式(静态常量)、双重检查锁定(DCL)以及枚举类型。 2. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种...

    javaweb课程设计心得体会

    学习JDBC涉及理解数据库连接池、预编译语句、事务管理等概念,以及如何使用Statement、PreparedStatement和ResultSet处理SQL查询结果。 6. **JavaWeb技术专题**:这可能包括URL路径处理、数据分页、结果集处理、...

    struts跟数据库的笔记,心得.rar

    1. 数据源配置:在Struts应用中,通常会通过Apache Commons DBCP或C3P0等连接池管理数据库连接。在`struts-config.xml`或`web.xml`中配置数据源,包括数据库URL、用户名、密码以及连接池参数等。 2. DAO(Data ...

    GoF23种经典模式+简单工厂模式讲解还有一篇心得

    在Java中,常用于控制资源的共享,如线程池或数据库连接池。 2. **工厂模式**:提供一个接口来创建对象,但让子类决定实例化哪个类。简单工厂模式是工厂模式的一种变体,适用于创建对象的类相对较少且固定的情况。 ...

    JavaWeb课程设计图书馆管理系统.docx

    2. 单例模式:用于Java中从连接池获取连接的类,确保全局只有一个实例,提高效率并避免资源浪费。 六、代码示例: 展示了Tomcat配置数据库连接池的XML代码和使用单例模式获取连接的Java代码。 七、系统效果: 通过...

    1云计算心得体会.doc

    此外,虽然云计算减少了本地设备的维护需求,但网络连接的质量对云服务的体验至关重要。 总的来说,云计算已经成为现代信息技术的基石,它改变了我们获取、处理和分享信息的方式。随着技术的不断发展,云计算将在...

    pai.rar_F79_java编程

    8. `MultiThreadedHttpConnectionManager$ConnectionPool.class` 和 `MultiThreadedHttpConnectionManager$HttpConnectionAdapter.class`: 这些是HttpClient的内部类,分别用于管理和适配HTTP连接池中的连接。...

    Oracle调优心得

    ### Oracle调优心得 在IT行业中,Oracle数据库作为专业数据库之一,在企业的高效运作中起着至关重要的作用。本文将从外部性能问题(如CPU、内存、网络)、行的重新排序、SQL语句调优等方面进行深入探讨,并提供一...

    sql2005一些个人体会之谈

    事务管理、连接池和批处理等特性进一步提高了应用性能。 在安全性方面,SQL Server 2005引入了角色和权限的概念,使得权限管理更为精细,有助于保护敏感数据。同时,透明数据加密(TDE)功能可以对整个数据库进行...

    ssm框架文档版总结

    - **连接池管理**:使用连接池管理数据库连接,避免频繁创建和关闭连接带来的性能损失。 - **SQL语句分离**:通过XML管理SQL语句,实现Java代码与SQL语句的分离,提高代码的可维护性和可读性。 - **动态SQL支持**:...

    hibernate学习总结

    例如,可以配置连接池、缓存策略、实体类的主键生成策略等。 Session是Hibernate的主要工作接口,它提供了与数据库交互的方法,如save、get、update、delete等。Session内部维护了一级缓存,用于存储当前Session中...

    性能总结报告(实例)

    配置了服务器的连接池大小、线程池参数等,以适应不同的负载需求。 2.3.2 **LoadRunner参数设置** 设置了虚拟用户数、迭代次数、事务速率等,以模拟真实用户的行为和系统负载。 2.4 **测试数据说明** 说明了...

    java技能总结

    - **maxTotal**: 最大连接池大小。 - **blockWhenExhausted**: 当连接耗尽时是否阻塞。 - **maxWaitMillis**: 获取连接的最大等待时间。 - **testOnBorrow**: 在借用连接时进行测试。 - **hostName**: Redis 服务器...

Global site tag (gtag.js) - Google Analytics