druid 连接池出现 关闭的连接 异常处理

druid 连接池出现 关闭的连接 异常处理

报错日志:

12:39:04.599 [Druid-ConnectionPool-Destroy-766221240] ERROR com.alibaba.druid.util.JdbcUtils - close statement error
java.sql.SQLRecoverableException: 关闭的连接
	at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:5389) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1578) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1563) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:84) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.vendor.OracleValidConnectionChecker.isValidConnection(OracleValidConnectionChecker.java:88) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidAbstractDataSource.validateConnection(DruidAbstractDataSource.java:1346) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource.shrink(DruidDataSource.java:2813) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource$DestroyTask.run(DruidDataSource.java:2562) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:2549) [druid-1.1.10.jar:1.1.10]
12:39:04.760 [Druid-ConnectionPool-Destroy-1073682365] ERROR com.alibaba.druid.util.JdbcUtils - close connection error
java.sql.SQLRecoverableException: IO 错误: Connection reset by peer: socket write error
	at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:556) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:3984) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:186) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.stat.StatFilter.connection_close(StatFilter.java:261) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:181) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.close(ConnectionProxyImpl.java:115) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:73) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource.shrink(DruidDataSource.java:2797) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource$DestroyTask.run(DruidDataSource.java:2562) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:2549) [druid-1.1.10.jar:1.1.10]
Caused by: java.net.SocketException: Connection reset by peer: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method) ~[?:1.8.0_151]
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111) ~[?:1.8.0_151]
	at java.net.SocketOutputStream.write(SocketOutputStream.java:155) ~[?:1.8.0_151]
	at oracle.net.ns.DataPacket.send(DataPacket.java:210) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.net.ns.NetInputStream.read(NetInputStream.java:260) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.net.ns.NetInputStream.read(NetInputStream.java:185) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.net.ns.NetInputStream.read(NetInputStream.java:102) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.T4C7Ocommoncall.doOLOGOFF(T4C7Ocommoncall.java:61) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:543) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]
	... 9 more

项目异常体现

项目是使用 tomcat 进行部署的,项目运行一段时间就出现应用僵死,然后在日志中也只看到上方的报错,无其他异常,重启 Tomcat 后又运行正常一段时间后又重复出现。

出现的原因:

网上查到资料说是:应用和数据库之间有一层防火墙。防火墙策略是有设置特定时间未使用的Socket连接将自动关闭。

当数据库连接池中的连接被创建而长时间不使用的情况下,该连接会自动回收并失效,但客户端并不知道,在进行数据库操作时仍然使用的是无效的数据库连接,这样,就导致客户端程序报“ java.sql.SQLException: Io 异常: Connection reset” 或“java.sql.SQLException 关闭的连接”异常。

解决办法:

druid 连接池的解决办法就是创建连接池是一下几个参数设置好:

spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.keepAlive=true
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL

解决办法中 druid 配置参数说明:

属性默认值备注
testOnBorrowfalse申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testOnBorrowfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testWhileIdletrue建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis单位毫秒有两个含义:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
validationQuery用来测试连接是否可用的SQL语句
minEvictableIdleTimeMillis1000L * 60L * 30L连接空闲时间大于该值并且池中空闲连接大于minIdle则关闭该连接 。默认30分钟
keepAlivefalse保持连接的有效性,也就是跟数据库续租,只有空闲时间大于keepAliveBetweenTimeMillis并且小于minEvictableIdleTimeMillis该参数才会有用

validationQuery:Druid用来测试连接是否可用的SQL语句,默认值每种数据库都不相同:

数据库类型sql语句
MysqlSELECT 1
SQLSERVERSELECT 1
ORACLESELECT ‘x’ FROM DUAL
PostGresqlSELECT ‘x’

注意:

连接池配置文件中以上参数都有进行配置,但是程序还是有报错;可以根据报错日志,错定位所使用的连接池,然后定位对应连接池创建的代码,看看是否是创建连接池的时候缺了以上对应的参数配置。

参考:
关于java.sql.SQLRecoverableException: Closed Connection异常的解决方案(转)

Druid配置参数详解-validationQuery

Druid源码分析(六) testOnBorrow,testOnReturn,testWhileIdle

keepAlive 参考:
Druid配置参数详解-keepAlive

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Druid连接池可以用于连接和管理ClickHouse数据库。ClickHouse是一个面向在线分析处理(OLAP)的列式数据库管理系统,支持高速的查询和分析大规模数据。 使用Druid连接池可以提高连接的效率和性能。连接池是一种连接管理机制,通过创建和维护一组预先初始化的数据库连接,应用程序可以通过从连接池获取连接来进行数据库访问操作,而不需要频繁地创建和销毁数据库连接Druid连接池支持连接的复用和管理,可以有效地减少连接的创建和销毁开销,提高数据库操作的效率。连接池可以通过设置最大连接数和最小空闲连接数,自动管理连接的数量,并根据需要动态调整连接的创建和销毁。 在使用Druid连接池连接ClickHouse时,需要先配置连接池的参数,如连接URL、用户名、密码等。然后可以通过从连接池获取连接来进行数据库操作,如执行查询、插入、更新等操作。使用完毕后,需要通过释放连接的方式将连接返回给连接池,以便其他应用程序可以重用该连接Druid连接池还提供了一些额外的特性,如连接的健康检查、连接的超时控制、连接的统计信息等,可以帮助我们更好地管理和监控连接的状态和性能。 总而言之,通过使用Druid连接池连接ClickHouse数据库,可以提高连接的效率和性能,减少连接创建和销毁的开销,并且提供一些额外的特性来管理和监控连接的状态和性能。 ### 回答2: Druid连接池与ClickHouse的结合为企业提供了强大的数据分析和查询功能。Druid是一个用于实时大数据分析的开源分布式数据存储系统,而ClickHouse是一个列式数据库管理系统,专注于高性能的数据存储和查询。 首先,Druid连接池可以通过将ClickHouse作为数据源来实现对ClickHouse数据的访问和查询。通过配置Druid的数据源连接信息,可以将ClickHouse集群加入到Druid连接池中。这样一来,Druid可以将ClickHouse集群中的数据加载到内存中进行高速查询和分析。 Druid连接池与ClickHouse的结合具有以下几个优点。首先,Druid的分段存储机制使得大部分数据都可以在内存中进行操作,因此查询速度非常快。同时,ClickHouse的列式存储方式可以有效地压缩数据,减小存储空间的占用。这样一来,企业可以实现高速的实时数据分析,并且节约存储空间。 其次,Druid与ClickHouse相结合可以实现多维分析。Druid连接池可以将ClickHouse中的数据按照多个维度进行分片和聚合,提供多维度的数据分析功能。企业可以基于Druid连接池对ClickHouse数据进行灵活的查询和分析,获取深入的业务洞察。 最后,Druid连接池与ClickHouse的结合还可以支持高可扩展性。Druid连接池可以通过与ClickHouse集群的横向扩展来处理大规模的数据查询和分析需求。ClickHouse通过水平扩展节点来增加查询和存储的吞吐量,而Druid连接池可以无缝地与扩容的ClickHouse集群进行对接,满足企业日益增长的数据处理需求。 综上所述,Druid连接池与ClickHouse的结合为企业提供了高速、多维的数据分析和查询功能,并支持高可扩展性。这种结合可以帮助企业更好地利用和分析大数据,为业务决策提供准确的依据。 ### 回答3: Druid是一个实时分析大数据的开源项目,而ClickHouse是一个快速的列式存储分析数据库连接Druid和ClickHouse可以将实时数据分析与大数据存储和查询相结合,从而实现更高效的数据分析和查询。 Druid连接池是一个用于管理Druid连接的工具,它可以提供一个连接池来保存和管理与ClickHouse的连接连接池的主要作用是优化连接的创建和销毁过程,减少连接的创建和销毁开销,从而提高连接的复用率和效率。 使用Druid连接池连接ClickHouse的步骤如下: 1. 配置Druid连接池:首先,我们需要在Druid的配置文件中设置ClickHouse的连接参数,包括ClickHouse的IP地址、端口、用户名和密码等信息。这样Druid连接池才能正确地建立与ClickHouse的连接。 2. 创建连接:接下来,我们可以通过Druid连接池来创建与ClickHouse的连接连接池会根据配置文件中设置的参数来创建连接,同时保持连接的可用性和安全性。 3. 使用连接:一旦连接成功建立,我们就可以使用连接来执行各种ClickHouse的操作,例如查询数据、写入数据等。连接池会自动管理连接的生命周期,包括连接的获取、释放和回收等操作。 4. 释放连接:当我们使用完连接后,应该及时释放连接,以便让连接进入连接池进行重复利用。这样可以避免频繁地创建和销毁连接,提高连接的复用率和效率。 连接池能够有效地管理连接资源,提高连接的利用率。通过连接池连接Druid和ClickHouse,我们可以实现高效的实时数据分析和查询,提升数据处理和分析的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值