apache的开源连接池 - BasicDataSource问题

今天在做一个300多M的xml文件加载入库的过程中发现一个严重的问题,经过几番查找后终于得以解决,在此做下记录:

 

问题描述:

加载xml文件的过程中有XML格式校验、解析、数据校验、入库四步操作,经过监控发现在入库之前的三个过程执行的时间较长,以至于在进行入数据库的过程中后台抛出如下异常:

2009-04-03 09:10:46,953 - ERROR TransactionInterceptor         - Application exception overridden by rollback exception
org.springframework.dao.DataAccessResourceFailureException: SqlMapClient operation; SQL [];  
--- The error occurred in net/htjs/rkxx/dao/sqlmaps/CZRK_BDXX_ZB.xml. 
--- The error occurred while applying a parameter map. 
--- Check the getSEQ_BDXX_ID-InlineParameterMap. 
--- Check the statement (query failed). 
--- Cause: java.sql.SQLException: Io 异常: Connection reset by peer: socket write error; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in net/htjs/rkxx/dao/sqlmaps/CZRK_BDXX_ZB.xml. 
--- The error occurred while applying a parameter map. 
--- Check the getSEQ_BDXX_ID-InlineParameterMap. 
--- Check the statement (query failed). 
--- Cause: java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
Caused by:
com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in net/htjs/rkxx/dao/sqlmaps/CZRK_BDXX_ZB.xml. 
--- The error occurred while applying a parameter map. 
--- Check the getSEQ_BDXX_ID-InlineParameterMap. 
--- Check the statement (query failed). 
--- Cause: java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:185)
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
 at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:566)
 at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:541)
 at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
 at org.springframework.orm.ibatis.SqlMapClientTemplate$1.doInSqlMapClient(SqlMapClientTemplate.java:243)
 at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:193)
 at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(SqlMapClientTemplate.java:241)
 at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(SqlMapClientTemplate.java:235)
 at net.htjs.rkxx.dao.impl.IDaoCZRK_BDXX_ZBImpl.getSEQ_BDXX_ID(IDaoCZRK_BDXX_ZBImpl.java:36)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
 at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 at $Proxy3.getSEQ_BDXX_ID(Unknown Source)
 at net.htjs.rkxx.service.rk.BDXXRKService.doSaveData(BDXXRKService.java:152)
 at net.htjs.rkxx.service.rk.BDXXRKService.doService(BDXXRKService.java:58)
 at net.htjs.listener.FileScanner$Processor.run(FileScanner.java:98)
Caused by: java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
 at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:812)
 at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1031)
 at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:836)
 at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1124)
 at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
 at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3390)
 at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:256)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.invoke(PreparedStatementLogProxy.java:62)
 at $Proxy6.execute(Unknown Source)
 at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:186)
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery(GeneralStatement.java:205)
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
 ... 23 more

 

问题分析:

程序中采用的是Spring+IBatis,数据源配置如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
  <property name="maxActive" value="100"/>
        <property name="maxIdle" value="30"/>
        <property name="maxWait" value="1000"/>
        <property name="defaultAutoCommit" value="true"/>
 </bean>

 

经过查找资料和分析,得出该问题主要是由于连接时间过长,失效所致,将以上配置修改如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
  <property name="maxActive" value="100"/>
        <property name="maxIdle" value="30"/>
        <property name="maxWait" value="1000"/>
        <property name="defaultAutoCommit" value="true"/>
        <property name="validationQuery" value="select * from dual"/>
 </bean>

 修改后经过测试,程序运行正常

 

问题总结:

当数据库连接池中的连接被创建而长时间不使用的情况下,该连接会自动回收并失效,但客户端并不知道,在进行数据库操作时仍然使用的是无效的数据库连接,这样,就导致客户端程序报“ java.sql.SQLException: Io 异常: Connection reset by peer”或“java.sql.SQLException 关闭的连接”异常,加上<property name="validationQuery" value="select * from dual"/>

配置后,客户端在使用一个无效的连接时会先对该连接进行测试,如果发现该连接已经无效,则重新从连接池获取有效数据库连接来使用

 

 

以上是个人的分析和理解,有不对的地方请大家指出共同讨论~~~

org.apache.commons.dbcp.BasicDataSource的解决方法 org.apache.commons.dbcp.BasicDataSource的解决方法,commons-dbcp.jar、commons-pool.jar 立即下载

相关推荐

AI 赋能测试全生命周期:多 Agent 协同的自动化提效方案

本文提出了一种基于Coze平台的多Agent协同测试解决方案,旨在解决软件测试中PRD解析不清晰、测试点覆盖不全、用例编写效率低、代码生成耗时等痛点。通过PRD优化、测试点生成、测试用例生成和单元测试框架生成四个Agent的协同工作,结合Cursor工具实现从需求到代码的全链路自动化。以电商平台登录模块为例,展示了从模糊PRD到标准化测试用例和可执行Java单元测试代码的完整转化流程。该方案通过AI赋能显著提升测试效率,减少人工干预,实现测试覆盖率≥95%,为快速迭代的软件研发提供了高效的测试自动化支持。

QINJIEEE的博客 1098

apache的BasicDataSource数据库连接问题

调用创建连接时报错: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 141,979 milliseconds ago.  The last pack

zhanglu201112的专栏 1335

HFSS新手避坑指南:手把手教你用FR4基板仿真威尔金森功分器(附参数优化技巧)

本文详细介绍了使用HFSS仿真FR4基板威尔金森功分器的12个关键细节,包括介质基板设置、微带线建模、隔离电阻设置等实战技巧。特别针对微波技术中的常见问题,提供了参数优化和结果解读的实用方法,帮助新手快速掌握HFSS仿真技能。

weixin_27310417的博客 225

你的数据库连接池配置真的生效了吗

最近在排查一个老系统的慢接口时,发现了一个问题。就是前人对数据库连接池的配置,根本没有生效,导致数据库连接池使用的是默认配置,在流量较高的时间,就会因为获取连接时,产生竞争,导致链路超时。下面是排查和解决过程。

lanicc's blog 1284

STM32+W5500实战:5分钟搞定FreeModbus TCP移植(附完整代码)

本文详细介绍了如何在STM32微控制器上,结合W5500以太网芯片,快速完成FreeModbus TCP协议栈的移植,构建稳定可靠的工业级Modbus TCP服务器。内容涵盖硬件连接、软件架构、驱动适配、核心移植代码实现及调试优化技巧,旨在提供可直接应用于实际项目的完整解决方案。

life6的博客 877

从Frenet坐标系到多项式拟合:Lattice Planner核心原理拆解与调参指南

本文深入解析了自动驾驶轨迹规划中Lattice Planner的核心原理,重点阐述了其在Frenet坐标系下解耦横纵向规划、利用五次和四次多项式拟合轨迹的数学基础。文章提供了从坐标系转换、采样策略到成本函数设计的完整工程实践指南,并分享了关键的参数调优经验,旨在帮助开发者高效实现稳定、平滑且安全的轨迹规划。

tech5的博客 1111

org.apache.commons.dbcp.BasicDataSource 是 Apache Commons DBCP(Database Connection Pooling)库中的一个类

在 Java Web 应用程序中,特别是当使用 Spring(SpringMVC、Spring Service、Spring DAO,简称 SSM)架构时,这样的连接池可以显著提高性能和数据库操作的效率。如果你使用的是更现代的数据库连接池库(如 HikariCP 或 C3P0),它们可能提供了更多的功能和更好的性能。请确保你已经将 Apache Commons DBCP 的相关依赖添加到你的项目中。还需要考虑其他连接池属性,如超时、验证查询等,以确保连接池的最佳性能和稳定性。

[Blog][Domain] programb.blog.youkuaiyun.com 1764

5分钟搞懂语义通信:如何用深度学习让AI理解你的真实意图?

本文深入解析了语义通信如何利用深度学习技术,实现从传统‘比特保真’到‘语义保真’的范式转移。通过介绍基于神经网络的端到端系统架构、编解码技术及实战案例,阐明AI如何理解并高效传递信息核心意图,为6G时代的人机交互奠定基础。

weixin_29191669的博客 262

DBCP连接池配置详解,参数列表

Spring DBCP配置 &amp;lt;bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource” destroy-method=“close”&amp;gt; &amp;lt;property name=“driverClassNa...

随风飘扬 9831

深入浅出一文搞懂Raft协议

前言 在分布式的世界里,要说最核心最复杂的功能,一致性的实现无出其右,之前的paxos算法堪称经典,被认为是同类算法中效果最好的,基本上成为分布式一致性的代名词,但是paxos算法也是出了名的难理解,而且相当不好实现。本人也花了很多时间、看了很多材料也没有真正理解。所以基于paxos的思想进行的一致性算法的简化和实现就成为了现实的需求,在此背景下,本文的主角Raft就出现了。 Raft算法的头号目标就是容易理解(UnderStandable),这从论文中就可以看出来。当然,R...

microGP的专栏 6485

C语言实现惯性导航初始对准全部核心代码

惯性导航初始对准包括间接粗对准和卡尔曼滤波精对准,其中。为基于卡尔曼滤波的精对准,其中。

十八与她的博客 2283

大二第十三次数据库连接池

什么是数据库连接池 在 JDBC 编程中,每次创建和断开Connectin 对象都会消耗一定的时间和IO 资源。这是因为在 Java 程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java 程序则要把代表连接的java.sqlComection 对象等加载到内存中,所以建立数据库连接的开销很大,尤其是在大量的并发访问时。假如某网站一天的访问量是10万,那么,该网站的服务器就需要创建、断开连接 10 万次,频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库

qq_55689800的博客 1032

OpenCV实现物体尺寸的测量

物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸。如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度。

qq_53545309的博客 9156

连接池(二)开源的连接池技术(DBCP)

开源的连接池技术 Sun公司约定: 如果是连接池技术,需要实现一个接口! javax.sql.DataSource; DBCP连接池 DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件: • Commons-dbcp.jar:连接池的实现 • Commons-pool.jar:连接池实现

Kerer的博客 348

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JDBC连接池

什么是数据库连接池 数据库连接池就是存放数据库连接的一个容器(集合)Connection。 当系统运行起来之后,这个连接池就被创建,在这个连接池当中,会申请一些对象,当有用户来访问数据库的时候,就从这个连接池当中获取连接对象,用户访问结束之后,连接池对象会归还给容器 连接池原理 在服务器端一次性创建多个连接,将多个连接保存在一个连接池对象中,当应用程序的请求需要操作数据库时,不会为请求创建新的连接,而是直接从连接池中获得一个连接,操作数据库结束之后,并不需要真正关闭连接,而是将连接放回到连接池中。 节省创

qq_51692241的博客 285

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java流行使用开源的数据库连接池DBCP

/定义一个静态的driver常量将mysql数据库驱动地址作为字符串初值赋值可以myeclipse中找到。//定义一个静态的driver常量将mysql数据库驱动地址作为字符串初值赋值可以myeclipse中找到。//初始创建多少个连接。

2401_89284451的博客 335

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

DBCP连接池

DBCP连接池 DBCP也是一个开源的连接池,是Apache成员之一,在企业开发中也比较常见,tomcat内置的连接池 1.创建项目 导入 jar包 将这两个 jar包添加到 myJar文件夹中 (jar包在资料里的软件文件夹中) 2.添加myJar库 到项目的依赖中 3.常见配置项 属性 描述 driverClassName 数据库驱动名称 url 数据库地址 ...

舞鹤白沙编码日志 650

连接池(二)--------DBCP和C3P0_前进的火车_新浪博客

一、DBCP: lDBCP是Apache软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个jar文件: •Commons-dbcp.jar:连接池的实现 •Commons-pool.jar:连接池实现的依赖库 lTomcat的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用...

sinat_36521092的博客 106

数据库连接池--概述以及DBCP实现

1. 为什么要引入数据库连接池   应用程序直接获取连接的方式中,用户每次请求都需要向服务器获得连接,而服务器创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万的访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库服务器的资源,并且极易造成数据库服务器内存溢出,宕机. 2. 开源的数据库连接池   数据库连接池必须实现javax.sql.DataSource接口...

weixin_30394633的博客 117

数据库连接池你用了吗

数据库连接的建立及关闭是一种极耗系统资源的操作,尤其是在多层结构的应用环境中,这种资源的耗费对系统性能影响尤为明显。在工作时做系统优化对这方面的很有体会,相同功能的查询语句,由于打开关闭数据库连接的次数不同导致两个查询语句耗费的时间差别很大。一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接。频繁地打开、关闭连接将会造成系统性能低下。虽然写高性能的sql语

黄爱岗廊坊师范学院信息技术提高班 第七期 2174

13数据库连接池与DBUtils

文章目录数据库连接池什么是数据库连接池DBCP 数据源1.commons-dbcp.jar包2.commons-pool.jar包通过BasicDataSource类直接创建数据源对象2.通过读取配置文件创建数据源对象C3P0 数据源DBUtils 工具DBUtils工具介绍ResultSetHandler 接口代码 数据库连接池 什么是数据库连接池 在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和1O资源。这是因为在Java程序与数据库之间建立连接时,数据库课要验正用户名和密码

qq_54262540的博客 644

22.连接池的使用

连接池技术 数据库连接的建立及关闭资源消耗巨大 传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开、关闭该物理连接,系统性能严重受损 解决方案:数据库连接池( Connection Pool) 系统初始运行时,主动建立足够的连接,组成一个池,每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接,使用完成后,不再关闭,而是归还 在并发访...

weixin_43520314的博客 216

数据库连接池

1. 自定义连接池 需求:预先创建一组连接,用的时候每次取出一个; 用完后,放回。 核心:单例模式、动态代理(可以监测接口中方法的执行) import java.io.InputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.refle...

qq_40302790的博客 175

org.apache.commons.dbcp.BasicDataSource 资源包下载

 兄弟们辛苦了这个包好难找啊 下载资源路径在这里http://commons.apache.org/downloads/download_dbcp.cgi

li285913050的专栏 3719
上一篇: OutputStreamWriter类getEncoding方法的应用
下一篇: WindowsXP上VMware下安装RedHat9的上网配置
javaRwx
博客等级 码龄20年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值