`

数据库连接长时间空闲后,爆连接已经关闭的解决方法

 
阅读更多

本文仅讨论使用连接池的情况:

在很多场合都碰到有人提问: 第二天第一次访问应用,总是报连接已经关闭(Connection Close)

其实,数据库连接池大都已经考虑了这个问题,进行设置一下即可:

Apache DBCP:

View Code JAVA
dataSource.setValidationQuery('select 1');

C3po:

View Code JAVA
dataSource.setTestConnectionOnCheckout(true);
dataSource.setPreferredTestQuery('select 1')

Proxool:

View Code JAVA
dataSource.setTestBeforeUse(true);
dataSource.setHouseKeepingTestSql('select 1')

Bonecp:
找不到对应的属性,不过可以配置连接的最大空闲时间

其实原来也就这么简单,返回连接给用户之前,先执行一条简单无害快速的SQL

 

<!-- google_ad_section_start -->
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10

 

原来是0.6.5的bug,使用0.7.0就解决此问题了。太信任他们了,以为是我配置或者数据库环境的问题呢。

<!-- google_ad_section_start -->
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10
<!-- google_ad_section_start -->
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10
<!-- google_ad_section_start -->
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10
分享到:
评论

相关推荐

    C# 数据库连接池 C# 数据库连接池

    数据库连接池是数据库管理中的一个重要概念,它在C#编程中扮演着优化数据库操作的关键角色。C#数据库连接池是一种管理数据库连接的技术,通过复用已存在的连接而不是每次请求时都创建新的连接,从而提高数据库操作的...

    C#高效数据库连接池源码

    - **超时管理**:连接池需要监控每个连接的空闲时间,避免因长时间未使用的“僵尸”连接占用资源。 - **线程安全**:在多线程环境下,连接池必须确保并发安全,防止数据竞争和同步问题。 6. **性能优化**: - **...

    数据库连接池java代码实现

    这样可以显著减少数据库连接的创建和关闭时间,提升系统的响应速度和并发能力。 首先,我们需要定义一个连接池类,它通常包含以下组件: 1. **连接池容量**:定义了池中最大可以保存的连接数量,这是连接池大小的...

    jsp连接数据库连接池代码示例

    数据库连接池是一种管理数据库连接的技术,它预先初始化一定数量的数据库连接并保存在内存中,当应用程序需要连接数据库时,可以从连接池中获取一个已存在的连接,用完后再归还,而不是每次都新建和关闭连接。...

    手动设计自定义数据库连接池

    5. **连接超时处理**:如果某个线程长时间未归还连接,连接池可以配置为自动断开该连接,以释放资源供其他线程使用。 #### 三、手动设计自定义数据库连接池 在实际开发过程中,有时可能会遇到标准的连接池解决方案...

    delphiADO数据库连接池

    3. **空闲连接管理**:连接池可能会有一个机制监控空闲连接,如果连接长时间未被使用,可以自动关闭,释放系统资源。这有助于保持系统的高效运行。 4. **异常处理与内存管理**:修复了"free时很慢"和"free时有内存...

    数据库连接池原理

    - 连接关闭后,客户端会出现大量TIME_WAIT的TCP状态。 - **使用连接池的网络交互** - 使用连接池后,首次访问数据库时需要建立连接,之后的访问将复用这些连接。这种方式可以显著减少网络交互次数,提升系统性能,...

    delphi数据库连接池

    4. 连接超时:为防止连接长时间未被释放导致资源浪费,可以设置超时机制,当连接空闲超过特定时间后自动回收。 5. 连接验证:在从池中获取连接时,可能需要进行验证,确保连接仍然有效,如检查网络状态、数据库...

    数据库连接池代码实现

    以上就是数据库连接池的基本概念和实现方法。在实际开发中,我们还需要考虑连接池的监控和调优,比如监控连接池的使用情况,根据性能指标调整参数,以及处理异常和错误情况,以保证系统的稳定性和高效性。

    自己写的数据库连接池

    - 连接超时和检查:定期检查连接的有效性,防止因长时间未使用的空闲连接导致的问题。 - 连接池大小管理:设置最小和最大连接数,避免资源浪费和连接耗尽。 - 监控和日志:记录连接池的使用情况,如当前连接数、借用...

    web中常用数据库连接池

    数据库连接池的基本工作原理是:当应用程序需要访问数据库时,首先从连接池中获取一个已经建立好的连接,使用完毕后,不是立即关闭连接,而是将其归还给连接池,以便其他请求再次使用。这样避免了频繁地打开和关闭...

    自定义的数据库连接池

    连接池的基本原理是预先初始化一定数量的数据库连接,这些连接在空闲时被存储在池中,当应用需要访问数据库时,可以从池中获取一个已存在的连接,用完后再归还回池,而不是直接关闭。这种机制可以显著降低系统的资源...

    数据库连接池的图解原理

    - **连接稳定性差**:单一连接长时间使用可能导致连接不稳定,从而增加服务器重启的概率。 #### 三、数据库连接池的基本原理 为了克服上述问题,引入数据库连接池的概念是非常必要的。连接池的基本思想是在程序...

    winform数据库连接池源码

    8. **最佳实践**:为了充分利用连接池,开发者应避免长时间持有数据库连接,尤其是在异步操作中。同时,尽可能使用相同的连接字符串创建连接,因为不同的连接字符串会创建不同的连接池。 总的来说,`...

    delphi实现数据库连接池

    在Delphi这个强大的Windows应用程序开发环境中,实现数据库连接池能够有效地解决频繁创建和销毁数据库连接带来的性能问题。下面我们将详细探讨如何在Delphi中实现数据库连接池,以及其核心概念和优势。 数据库连接...

    数据库连接池完美讲解(含源码)

    5. 连接超时和空闲连接回收:设置超时和空闲时间,防止长时间未使用的连接占用资源。 常见的数据库连接池实现有Apache的DBCP、C3P0,以及HikariCP等。其中,HikariCP以其优秀的性能和稳定性受到广泛欢迎,它的设计...

    几种数据库连接池详细配置

    - **minEvictableIdleTimeMillis**: 连接闲置多长时间后可被驱逐,默认为30分钟。 - **timeBetweenEvictionRunsMillis**: 驱逐线程检查连接的有效性的时间间隔,默认为-1,表示不执行驱逐。 - **testOnBorrow**: 借...

    JSP 数据库连接池技术

    例如,当连接池检测到某个连接长时间未被使用或出现异常时,它可以自动回收该连接,以确保系统的稳定性和可靠性。 此外,合理配置连接池参数对于系统性能至关重要。例如,`initialSize`定义了启动时创建的连接数,`...

Global site tag (gtag.js) - Google Analytics