`
yo8237233
  • 浏览: 62139 次
  • 来自: 深圳
社区版块
存档分类
最新评论

druid连接池异常

    博客分类:
  • J2EE
阅读更多

在从excel导入10W条数据到mysql中时,运行一段时间就会抛这个异常,连接池问题

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:
Caused by: java.sql.SQLException: connection holder is null
	at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1085)
	at com.alibaba.druid.pool.DruidPooledConnection.getMetaData(DruidPooledConnection.java:825)
	at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:285)

找了下解决方案
1.

给jdbc url 增加 autoReconnect=true 一定能解决你的问题,可以定期观察一下 show processlist
改进方法如下:
<property name="url" value="jdbc:mysql://localhost/数据库实例名称?&useUnicode=true&characterEncoding=utf-8&autoReconnect=true"/>

2.

寻找支持重连的连接池。
           注意:c3p0连接池支持重连;重连参数是:
               idleConnectionTestPeriod   设置空闲连接测试周期
               preferredTestQuery : 设置一查询语句,用于重连测试
              testConnectionOnCheckin设置为true
              testConnectionOnCheckout设置为true

在sessionFactory里配置:

<property name="hibernateProperties">
   <props>

        <prop key="hibernate.autoReconnect">true</prop>

  </props>
</property>
这两种不同的配置都是使连接池自动重连

后面发现问题还是存在

通过研究源码我可以确定"Druid提供的getConnection()或者getConnection(long maxWaitMillis)方法不能保证在同一个线程中获取的始终是一个连接,直到显示的将连接关闭吗?"。必须在程序在缓存从Druid中取出的连接才能保证现一个事务在使用的是同一个连接。

而抛出“connection holder is null”异常的原因可能在于:

关闭长时间不使用的连接超时时间,单位秒
removeAbandonedTimeout

假设这个参数的值 为30分钟,当一个连接在获取后30分钟还没释放,也就是Connection的DruidPooledPreparedStatement对象执行完了executXXX()方法但还未执行close、commit、rollback方法,对应于Connection的running参数的值为false,这时Durid的DestroyConnectionThread线程会自动将该连接回收。当程序要commit()连接时会执行checkState()方法,这个方法会执行以下代码:

if (holder == null) {  
 if (disableError != null) {  
   throw new SQLException("connection holder is null", disableError);  
    } else {  
   throw new SQLException("connection holder is null");  
    }  
} 


这段代码就是我们看到的“connection holder is null”异常的来源,因此,我们需要做的就是根据Druid提供的监控信息(主要看“连接持有时间分布”的值)修改这个参数的值,它的值一定要比最长的连接持有时间还要大。

最后我把链接自动清除配置关闭解决了问题
removeAbandoned=false
如果把这个时间调整大一点应该也是可以的
removeAbandonedTimeout=1800
分享到:
评论

相关推荐

    Druid连接池以及C3P0

    **Druid连接池** Druid是由阿里巴巴开源的高性能、功能强大的数据库连接池。它不仅提供了基础的数据库连接池功能,还包含了很多其他特性,如监控、SQL解析、日志记录等。以下是一些关键点: 1. **性能优秀**:...

    mysql驱动+druid连接池+JdbcTemplate

    MySQL驱动、Druid连接池和JdbcTemplate是Java开发中与数据库交互的重要组件。在这个压缩包中,你将找到实现高效、稳定和灵活的数据库操作所需的所有资源。 首先,MySQL驱动是Java应用程序连接到MySQL数据库的基础。...

    DRUID连接池的实用 配置详解

    ### DRUID连接池实用配置详解 #### DRUID简介 DRUID是阿里巴巴开源的一款数据库连接池组件,它集合了C3P0、DBCP、PROXOOL等其他数据库连接池的优点,并在此基础上增加了日志监控功能,使得用户能够更好地监控...

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

    Druid连接池的主要优点包括: 1. **性能优异**:Druid经过大量的性能优化,其性能表现优于其他常见的连接池,如C3P0和DBCP。 2. **监控功能**:内置的WebStatFilter和StatViewServlet可以提供详细的数据库访问统计...

    druid连接池源码和jar包下载

    **Druid连接池详解** Druid是阿里巴巴开源的一款高性能、功能强大的数据库连接池组件,它在Java编程领域中被广泛使用,特别是在大型互联网项目中。Druid提供了监控、SQL解析、防御性编程等功能,旨在提高数据库连接...

    druid数据库连接池详细属性配置

    **Druid数据库连接池详细属性配置** Druid是阿里巴巴开源的一款高效、强大的数据库连接池组件,它在性能、监控和扩展性方面表现出色。Druid不仅是一个连接池,还包含了SQL解析器、日志监控、SQL执行效率分析等功能...

    druid连接池所用jar(druid-1.0.15.jar)

    Druid连接池是Java开发中广泛使用的数据库连接管理工具,它由阿里巴巴开源并维护,提供了强大的监控和扩展功能。Druid-1.0.15.jar是这个库的特定版本,包含了实现Druid连接池功能所需的类和资源。下面将详细介绍...

    数据库连接池案例包括c3p0,druid,和自己手写的连接池

    实现自定义连接池需要考虑线程安全、连接有效性检测、异常处理等问题,同时,还需要合理设计API以方便集成到项目中。 在实际应用中,选择哪种连接池取决于项目的规模、性能需求以及团队对各组件的熟悉程度。例如,...

    Druid连接池.rar

    Druid连接池是Java开发中广泛使用的数据库连接池组件,它由阿里巴巴公司开发并维护,旨在提供高效、稳定、强大的数据库连接管理。Druid的核心特性包括性能监控、SQL解析、安全过滤以及丰富的扩展点,使得它在众多...

    druid连接池工具包

    下面我们将深入探讨Druid连接池的几个关键知识点。 1. **连接池原理**: 数据库连接池在初始化时会创建一定数量的数据库连接,这些连接可以被多个应用线程共享,避免了频繁创建和销毁连接带来的性能开销。当一个...

    Druid数据库连接池及内置监控的配置和使用.zip

    2. **Druid连接池的配置** - **基本配置**:包括数据源类型(如MySQL)、驱动类、URL、用户名和密码。这些信息通常写在` DruidDataSource `类的实例化代码或配置文件中。 - **初始化参数**:如最大连接数、最小...

    Druid数据库连接池

    1. **初始化Druid连接池**:设置数据源的基本属性,如数据库URL、用户名、密码、最小连接数、最大连接数等。 2. **获取数据库连接**:通过Druid的数据源,提供便捷的获取和释放连接的方法。 3. **执行SQL语句**:...

    java数据库连接池Druid

    Druid连接池与其他连接池(如C3P0、DBCP等)相比,具有更好的性能和稳定性。 2. **核心特性** - **高性能**: Druid通过预读取、缓存以及空闲连接检测等机制,确保了高效的数据库连接管理。 - **监控**: 内置的...

    数据库连接池druid-1.1.21.jar 和 配置文件druid.properties

    本主题将深入探讨数据库连接池Druid以及它的1.1.21版本,同时也会涉及如何配置其核心组件——`druid.properties`文件。 Druid是一个流行的Java数据库连接池实现,由阿里巴巴开发并开源。它不仅提供了数据库连接池的...

    druid数据库连接池实现jar包.zip

    Druid数据库连接池是阿里巴巴开源的一款高效、强大的数据库连接池组件,它在Java应用程序中用于管理数据库连接,提高数据库访问性能并优化资源利用。这个压缩包包含`druid-1.1.22.jar`和`druid.properties`两个文件...

    最新版druid 数据库连接池 druid-1.1.21.jar

    - `maxWait`:当连接池达到最大值时,等待新连接的最大时间,超过这个时间会抛出异常。 - `testOnBorrow`和`testOnReturn`:在连接被借出和归还时是否进行验证,确保连接的有效性。 6. **配置灵活**:Druid提供了...

    druid-1.2.8.jar

    Druid连接池,全称是Druid Data Source,是由阿里巴巴开源的一个高效、强大的数据库连接池组件。在Java开发中,数据库连接池是管理数据库连接的重要工具,它可以提高数据库访问的效率,减少系统资源的浪费,是现代...

    MySql_JDBC, Druid数据库连接池以及Template技术所需jar包.zip

    MySQL JDBC驱动使得Java应用程序能够连接到MySQL数据库,Druid连接池管理数据库连接,提高资源利用率,而Template技术则简化了数据库操作,使得代码更加整洁。为了集成这些技术,开发者通常会将对应的jar包添加到...

    数据库连接池C3P0,Druid数据库连接池jar包.zip

    2. Druid连接池: Druid是阿里巴巴开源的一个数据库连接池实现,它的设计目标是提供强大的监控和扩展能力。Druid的优点有: - 高性能:Druid内部实现采用了一系列的优化技术,如Statement缓存、连接池预热等,提升...

Global site tag (gtag.js) - Google Analytics