在从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连接池的主要优点包括: 1. **性能优异**:Druid经过大量的性能优化,其性能表现优于其他常见的连接池,如C3P0和DBCP。 2. **监控功能**:内置的WebStatFilter和StatViewServlet可以提供详细的数据库访问统计...
**Druid连接池** Druid是由阿里巴巴开源的高性能、功能强大的数据库连接池。它不仅提供了基础的数据库连接池功能,还包含了很多其他特性,如监控、SQL解析、日志记录等。以下是一些关键点: 1. **性能优秀**:...
MySQL驱动、Druid连接池和JdbcTemplate是Java开发中与数据库交互的重要组件。在这个压缩包中,你将找到实现高效、稳定和灵活的数据库操作所需的所有资源。 首先,MySQL驱动是Java应用程序连接到MySQL数据库的基础。...
### DRUID连接池实用配置详解 #### DRUID简介 DRUID是阿里巴巴开源的一款数据库连接池组件,它集合了C3P0、DBCP、PROXOOL等其他数据库连接池的优点,并在此基础上增加了日志监控功能,使得用户能够更好地监控...
**Druid连接池详解** Druid是阿里巴巴开源的一款高性能、功能强大的数据库连接池组件,它在Java编程领域中被广泛使用,特别是在大型互联网项目中。Druid提供了监控、SQL解析、防御性编程等功能,旨在提高数据库连接...
**Druid数据库连接池详细属性配置** Druid是阿里巴巴开源的一款高效、强大的数据库连接池组件,它在性能、监控和扩展性方面表现出色。Druid不仅是一个连接池,还包含了SQL解析器、日志监控、SQL执行效率分析等功能...
Druid连接池是Java开发中广泛使用的数据库连接管理工具,它由阿里巴巴开源并维护,提供了强大的监控和扩展功能。Druid-1.0.15.jar是这个库的特定版本,包含了实现Druid连接池功能所需的类和资源。下面将详细介绍...
实现自定义连接池需要考虑线程安全、连接有效性检测、异常处理等问题,同时,还需要合理设计API以方便集成到项目中。 在实际应用中,选择哪种连接池取决于项目的规模、性能需求以及团队对各组件的熟悉程度。例如,...
Druid连接池是Java开发中广泛使用的数据库连接池组件,它由阿里巴巴公司开发并维护,旨在提供高效、稳定、强大的数据库连接管理。Druid的核心特性包括性能监控、SQL解析、安全过滤以及丰富的扩展点,使得它在众多...
下面我们将深入探讨Druid连接池的几个关键知识点。 1. **连接池原理**: 数据库连接池在初始化时会创建一定数量的数据库连接,这些连接可以被多个应用线程共享,避免了频繁创建和销毁连接带来的性能开销。当一个...
2. **Druid连接池的配置** - **基本配置**:包括数据源类型(如MySQL)、驱动类、URL、用户名和密码。这些信息通常写在` DruidDataSource `类的实例化代码或配置文件中。 - **初始化参数**:如最大连接数、最小...
1. **初始化Druid连接池**:设置数据源的基本属性,如数据库URL、用户名、密码、最小连接数、最大连接数等。 2. **获取数据库连接**:通过Druid的数据源,提供便捷的获取和释放连接的方法。 3. **执行SQL语句**:...
Druid连接池与其他连接池(如C3P0、DBCP等)相比,具有更好的性能和稳定性。 2. **核心特性** - **高性能**: Druid通过预读取、缓存以及空闲连接检测等机制,确保了高效的数据库连接管理。 - **监控**: 内置的...
- `maxWait`:当连接池达到最大值时,等待新连接的最大时间,超过这个时间会抛出异常。 - `testOnBorrow`和`testOnReturn`:在连接被借出和归还时是否进行验证,确保连接的有效性。 6. **配置灵活**:Druid提供了...
Druid数据库连接池是阿里巴巴开源的一款高效、强大的数据库连接池组件,它在Java应用程序中用于管理数据库连接,提高数据库访问性能并优化资源利用。这个压缩包包含`druid-1.1.22.jar`和`druid.properties`两个文件...
Druid连接池,全称是Druid Data Source,是由阿里巴巴开源的一个高效、强大的数据库连接池组件。在Java开发中,数据库连接池是管理数据库连接的重要工具,它可以提高数据库访问的效率,减少系统资源的浪费,是现代...
MySQL JDBC驱动使得Java应用程序能够连接到MySQL数据库,Druid连接池管理数据库连接,提高资源利用率,而Template技术则简化了数据库操作,使得代码更加整洁。为了集成这些技术,开发者通常会将对应的jar包添加到...
2. Druid连接池: Druid是阿里巴巴开源的一个数据库连接池实现,它的设计目标是提供强大的监控和扩展能力。Druid的优点有: - 高性能:Druid内部实现采用了一系列的优化技术,如Statement缓存、连接池预热等,提升...
报错异常: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource 可用...