请教如何不依赖配置文件纯Java调用druid连接池没有关闭

druid连接池异常
日期: 04:09:02
来源:ITeye
druid连接池异常
在从excel导入10W条数据到mysql中时,运行一段时间就会抛这个异常,连接池问题
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Ses 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"&
&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);
throw new SQLException("connection holder is null");
这段代码就是我们看到的“connection holder is null”异常的来源,因此,我们需要做的就是根据Druid提供的监控信息(主要看“连接持有时间分布”的值)修改这个参数的值,它的值一定要比最长的连接持有时间还要大。
最后我把链接自动清除配置关闭解决了问题
removeAbandoned=false
如果把这个时间调整大一点应该也是可以的
removeAbandonedTimeout=1800
本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
IOC容器简介 IOC容器体系结构
容器组成部分 IOC容器工作机制
bean生命周期
容器加载管理的流程
Spring的IOC相当于spring的心脏,spring所有的功能都是围绕容器来进行扩展的。有人说spring的IOC容器不就是一个Bean工厂嘛,利用反射实例化java bean然后缓存起来。对于这种见解,笔者只能认为其认知十分肤浅。IOC是控制反转的简称,也叫做依赖注入,也就是说将Bean的控制权都交由Spring来管理,理想的情况下是完全基于接口编
在JAVA项目中读取资源文件经常会遇到路径的问题 最近总结了一下几种路径的获取方法 一、CLASSPATH 路径 1.说明
对于普通应用程序来说此路径
项目名/bin/classes
对于WEB程序来说是在
WEB-INF/classes 2.读取方法(SpringTest是项目下的随意一个类)
path= SpringTest.class.getResource("").getPath(); //类所在的目录
JEECG 社区开源项目下载(总览) 反馈问题板块: http://www.jeecg.org/forum.php?mod=forumdisplayfid=153 资源1: JEECG 微云快速开发平台( JEECG 3.6.5
云插件开发版 ) 最新版本:发布时间 () 授权方式: 开源免费 源码下载(Maven): http://git.oschina.net/jeecg/jeecg
https://code.c
“ 当一个对象被当作参数传递到一个方法 ”,这就是所谓的按引用传递。
public class User { private S public String getName() { } public void setName(String name) { this.name = } }
public class Test { public void set(User user){ user.setName("hello world");
这里就直接贴代码了 package mon.util.import java.util.ArrayLimport java.util.Limport com.mon.exception.BussinessE/** * 统计任三出现的最多的几率的组合 * * @author lh * @date
*/public class Copy2OfStatisAnyThree {// 组合算法/
程序员一直都是一个备受人们关注的群体。2014年,据IDC统计,全球约有1850万名程序员,中国占10%。随着近年全国互联网创业热潮的兴起,“互联网+”、“云计算”以及“智能硬件”等领域发展迅速,市场对程序员的需求更为旺盛。 由程序员客栈联合稀土掘金通过对北京、广东、浙江、上海等全国28个省、直辖市及特别行政区的10W+优秀程开发者进行了一次调查。调查报告里对程序员的年龄组成、性别比例、擅长的计算机语言、工作时间以及薪资等进行了统计和分析。
地理分布: 数据来源:程序员客栈/稀土掘金
xml: ?xml version='1.0' encoding='UTF-8'? data message status2/status value识别成功/value /message cardsinfo card type="2" item desc="姓名"张三/item item desc="性别"男/item item desc="民族"满/item item desc="出生"/item /card /cardsinfo /data
java代码: try {
已经安装好的maven的环境下 在pom.xml中配置如下: buildplugingroupIdorg.mortbay.jetty/groupIdartifactIdjetty-maven-plugin/artifactIdconfigurationwebAppConfig!-- allowDuplicateFragmentNamestrue/allowDuplicateFragmentNames --/webAppConfigscanIntervalSeconds0/scanIntervalSecond
1. 项目中添加支持json的相关jar包, 本例中使用的是 fastjson-1.1.36.jar, struts2-json-plugin-2.3.30.jar
2. struts2 配置文件中,对页面跳转的路径进行添加和配置, 继承的的不再是struts-default, 而是 json-default
!-- 继承的的不再是struts-default, 而是 json-default --package name="ajax" namespace="/ajax" extends=
!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver --
beans:bean id="multipartResolver" class="org.springframework.monsMultipartResolver" p:defaultEncoding="UTF-8" p:maxUploadSize="5400000" p:uploadTempDir="fileUpload
Copyright (C)
ITfish.netdruid连接池 一段时间不用,然后在使用就会报错 - 开源中国社区
当前访客身份:游客 [
当前位置:
这个一段时间在20分钟左右吧,粗略估计
使用的是spring3,struts2,mybatis3.2.2 连得oracle druid1.0.1
一直拿不到数据库连接,前台无响应,过一段时间会报下边的错误,然后才能正常得到连接,执行查询
系统在linux和windows上都有跑 因为是内网,错误只能给个大体的了
windows错误是
close connection error
caused by SQLRecorableException:io错误Connection reset by peer:socket write error
caused by SocketException Connection reset by peer:socket write error
close connection error
caused by SQLRecorableException:io错误 断开的管道
caused by SocketException& 断开的管道
我建立了一个进程,每半分钟会用mybatis查询一下数据库,就不会有问题,但是validationQuery,testWhileIdel,TimeBetweenEvictionRunsMills都设置了,下边给出数据源配置
&property name="driverClassName" value="${jdbc.driver}" /&
&&&&&&&&& &
&&&&&&&&&&& &!-- 基本属性 url、user、password --&
&&&&&&&&&&& &property name="url" value="${jdbc.url}" /&
&&&&&&&&&&& &property name="username" value="${jdbc.username}" /&
&&&&&&&&&&& &property name="password" value="${jdbc.password}" /&
&&&&&&&&&& &
&&&&&&&&&&& &!-- 配置初始化大小、最小、最大 --&
&&&&&&&&&&& &property name="initialSize" value="${jdbc.pool.minIdle}" /&
&&&&&&&&&&& &property name="minIdle" value="${jdbc.pool.minIdle}" /&
&&&&&&&&&&& &property name="maxActive" value="${jdbc.pool.maxActive}" /&&&&&&&&&& &
&&&&&&&&&&& &!-- 配置获取连接等待超时的时间 --&
&&&&&&&&&&& &property name="maxWait" value="60000" /&&&&& &
&&&&&&&&&&& &!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --&
&&&&&&&&&&& &property name="timeBetweenEvictionRunsMillis" value="30000" /&
&&&&&&&&&& &
&&&&&&&&&&& &!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --&
&&&&&&&&&&& &property name="minEvictableIdleTimeMillis" value="300000" /&
&&&&&&&&&& &
&&&&&&&&&&& &property name="validationQuery" value="SELECT 'x' FROM DUAL" /&
&&&&&&&&&&& &property name="testWhileIdle" value="true" /&
&&&&&&&&&&& &property name="testOnBorrow" value="false" /&
&&&&&&&&&&& &property name="testOnReturn" value="false" /&
&&&&&&&&&& &
&&&&&&&&&&& &!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
&&&&&&&&&&& &property name="poolPreparedStatements" value="true" /&
&&&&&&&&&&& &property name="maxPoolPreparedStatementPerConnectionSize" value="20" /& --&
1.我设置了validationQuery感觉像是没有起作用,因为加入心跳后就正常了,
2.系统断开了一段时间没有活动的连接,这其实跟1差不多,明明设置了validationQuery的
3.oracle断开了无活动连接,但我看了一下是unlimited的,
4.查看本地端口与服务器1521端口的tcp连接,在不操作的时候,tcp连接一直有,在服务端也有,但只要使用,就会全部断开,换成新的,因为本地的端口都改变了,但是服务器上的这个端口还是established
5.在druid的监控平台查看连接数,一直显示正常,但是在用的时候会全部消失,只剩下一条,这一条应该是重新创建的
1.有办法查看validationQuery有没有起作用吗,在sql监控里边看不到这条语句~
2,oracle的unlinited我是在dba_profile中看的,不确定是在这吗
3.这问题到底是怎么出的额?大牛们,内网导个东西麻烦死,还没有换个数据源试过
共有5个答案
<span class="a_vote_num" id="a_vote_num_
&&&&我在OSC看过之前很多人遇到过这个问题,按照其他连接池的设置,都没能解决。最后都不了了之。我没用过druid,也不知道解决方案。
&&&&我认为这个是druid的bug.
--- 共有 2 条评论 ---
问这个问题的人太多了,应该是本身的Bug
(1年前)&nbsp&
0.0我是接的二手的这个项目,难道要我换连接池,倒是也好换,只是问题解决不了感觉很难受~
(1年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
为什么没有回答的呢0.0
<span class="a_vote_num" id="a_vote_num_
这是连接老化问题, 好解决, 应该有一个连接空闲多久, 就断开的参数设置, 你找找, dbcp, c3p0都是有的,
--- 共有 1 条评论 ---
首先,非常感谢你的回答~我就是没找到为什么会连接老化的,才分好几个方面测试了,maxIdleTime什么的默认值是0的,也就是永不断开~我感觉是druid或者是系统设置的问题,但怎么也没找出是哪里出了问题
(1年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
这种问题是很常见的, 比如说, 数据库重启了, 连接池如果没有进行设置的话, 他认为池里的连接还是正常的, 取得后就会报错, 这些基本上连接池已解决了此类问题, 不过需要进行参数设置而已, 取得一个错误连接后, 再取一个正常连接类似这样子的
<span class="a_vote_num" id="a_vote_num_
老化的原因有很多, 比如 网络抖动 什么的, 会导致连接是无效的
--- 共有 2 条评论 ---
: 呵呵, 我只是提供思路给你,
具体的设置你得自己去试, 各参数之间是相关的, 我使用过c3p0, dbcp都碰到过你的这种情况, 后来都是这样解决的
(1年前)&nbsp&
嗯,一开始我也是这么想的,都是内网机,网络抖动不知道是什么,但抖动的话tcp连接应该断开吧~,不操作之前两边的tcp连接都是有的,重启也不可能,过20分钟左右就会这样,最主要的是我设置的测试sql语句的,但好像并没有起作用
(1年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
进入休眠期的其它问题
类似的话题Druid 1.0.9 发布下载,Java 数据库连接池_Linux新闻_Linux公社-Linux系统门户网站
你好,游客
Druid 1.0.9 发布下载,Java 数据库连接池
来源:oschina.net&
作者:Linux
Druid 1.0.9 发布下载了,该版本支持使用不同线程申请连接和关闭连接。此外改进了 sqlwall&
下载地址:
Druid 的详细介绍:Druid 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
& (07/12/:10)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款21073人阅读
编程开发(36)
淘宝连接池Druid &/index.php/archives/635/
/wiki/display/Druid/Home
druid使用 http://blog.csdn.net/yunnysunny/article/details/8657095
Mybatis整合Druid和H2嵌入式数据库&http://my.oschina.net/u/580483/blog/91435
druid-0.2.19.jar只支持JDK1.6以上
DataSourceUtil
package taobao_
import java.io.BufferedInputS
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.io.InputS
import java.util.P
import javax.sql.DataS
import com.alibaba.druid.pool.DruidDataSourceF
* The Class DataSourceUtil.
public class DataSourceUtil {
/** 使用配置文件构建Druid数据源. */
public static final int DRUID_MYSQL_SOURCE = 0;
/** 使用配置文件构建Druid数据源. */
public static final int DRUID_MYSQL_SOURCE2 = 1;
/** 使用配置文件构建Dbcp数据源. */
public static final int DBCP_SOURCE = 4;
public static String confile = &druid.properties&;
public static Properties p =
p = new Properties();
InputStream inputStream =
//java应用
confile = DataSourceUtil.class.getClassLoader().getResource(&&).getPath()
System.out.println(confile);
File file = new File(confile);
inputStream = new BufferedInputStream(new FileInputStream(file));
p.load(inputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
* 根据类型获取数据源
* @param sourceType
数据源类型
* @return druid或者dbcp数据源
* @throws Exception
the exception
public static final DataSource getDataSource(int sourceType) throws Exception {
DataSource dataSource =
switch (sourceType) {
case DRUID_MYSQL_SOURCE:
dataSource = DruidDataSourceFactory.createDataSource(p);
case DRUID_MYSQL_SOURCE2:
dataSource = DruidDataSourceFactory.createDataSource(p);
case DBCP_SOURCE:
// dataSource = BasicDataSourceFactory.createDataSource(
// MySqlConfigProperty.getInstance().getProperties());
return dataS
TableOperator
package taobao_
import java.sql.C
import java.sql.PreparedS
import java.sql.SQLE
import java.sql.S
import javax.sql.DataS
public class TableOperator {
private DataSource dataS
public void setDataSource(DataSource dataSource) {
this.dataSource = dataS
private static final int COUNT = 5;
public TableOperator() {
public void tearDown() throws Exception {
dropTable();
} catch (SQLException e) {
e.printStackTrace();
public void insert() throws Exception {
StringBuffer ddl = new StringBuffer();
ddl.append(&INSERT INTO t_big (&);
for (int i = 0; i & COUNT; ++i) {
if (i != 0) {
ddl.append(&, &);
ddl.append(&F& + i);
ddl.append(&) VALUES (&);
for (int i = 0; i & COUNT; ++i) {
if (i != 0) {
ddl.append(&, &);
ddl.append(&?&);
ddl.append(&)&);
Connection conn = dataSource.getConnection();
System.out.println(ddl.toString());
PreparedStatement stmt = conn.prepareStatement(ddl.toString());
for (int i = 0; i & COUNT; ++i) {
stmt.setInt(i + 1, i);
stmt.execute();
stmt.close();
conn.close();
private void dropTable() throws SQLException {
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
stmt.execute(&DROP TABLE t_big&);
stmt.close();
conn.close();
public void createTable() throws SQLException {
StringBuffer ddl = new StringBuffer();
ddl.append(&CREATE TABLE t_big (FID INT &);
for (int i = 0; i & COUNT; ++i) {
ddl.append(&, &);
ddl.append(&F& + i);
ddl.append(& varchar2(10)&);
ddl.append(&)&);
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
System.out.println(ddl.toString());
stmt.execute(ddl.toString());
stmt.close();
conn.close();
MutilThreadTest
package taobao_
import java.sql.SQLE
import java.util.ArrayL
import java.util.L
import java.util.concurrent.C
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import java.util.concurrent.F
import java.util.concurrent.TimeU
public class MutilThreadTest {
public static void main(String argc[]) throws Exception {
test(DataSourceUtil.DBCP_SOURCE, 50);
test(DataSourceUtil.DRUID_MYSQL_SOURCE, 50);
public static void test(int dbType, int times) throws Exception {
int numOfThreads = Runtime.getRuntime().availableProcessors() * 2;
ExecutorService executor = Executors.newFixedThreadPool(numOfThreads);
final TableOperator test = new TableOperator();
// int dbType = DataSourceUtil.DRUID_MYSQL_SOURCE;
// dbType = DataSourceUtil.DBCP_SOURCE;
test.setDataSource(DataSourceUtil.getDataSource(dbType));
boolean createResult =
test.createTable();
createResult =
} catch (SQLException e) {
e.printStackTrace();
if (createResult) {
List&Future&Long&& results = new ArrayList&Future&Long&&();
for (int i = 0; i & i++) {
results.add(executor.submit(new Callable&Long&() {
public Long call() throws Exception {
long begin = System.currentTimeMillis();
test.insert();
// insertResult =
} catch (Exception e) {
e.printStackTrace();
long end = System.currentTimeMillis();
return end -
executor.shutdown();
while (!executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS))
long sum = 0;
for (Future&Long& result : results) {
sum += result.get();
System.out.println(&---------------db type & + dbType
+ &------------------&);
System.out.println(&number of threads :& + numOfThreads + & times:&
System.out.println(&running time: & + sum + &ms&);
System.out.println(&TPS: & + (double) (100000 * 1000)
/ (double) (sum));
System.out.println();
test.tearDown();
// dropResult =
} catch (Exception e) {
e.printStackTrace();
System.out.println(&初始化数据库失败&);
src下druid.properties:
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.97.51:1521:lc8
username=admin8
password=adminpwd8
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:266458次
积分:3256
积分:3256
排名:第7492名
原创:68篇
转载:15篇
评论:25条
(1)(3)(1)(2)(1)(3)(2)(4)(2)(4)(7)(2)(3)(3)(1)(4)(2)(1)(2)(1)(3)(6)(4)(7)(8)(2)(1)(3)(2)(2)(2)

我要回帖

更多关于 druid连接池 的文章

 

随机推荐