`
qdpurple
  • 浏览: 276660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

连接池关于主动关闭连接的问题分析

阅读更多

讨论1. 使用连接池后在通过连接池获取连接,进行数据库操作时, 是否需要主动关闭连接

项目中使用了apache dbcp 连接池后, 点击查询,当查询多次后,报如下错误:

 

 

org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
	at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

 

 分析:

通过测试,通过restart server后, 前10次,均可查询成功, 之后就开始报此错误. 推测是通过连接池获取数据连接后,

此连接一直占用状态, 当再次请求后,由于连接池中没有可用连接,所有请求连接时,就报了等待超时错误.

之前对数据库连接池, 有个理解: 连接池用在管理数据库连接的创建,关闭操作, 就以为无需关闭连接, 让连接池来自动关闭.

处理过程:

1 .通过查看dbcp源代码,关于连接池相关属性的设置:

1). maxActive/ maxWait: 源码如下, 意思 最大活动连接数,默认为8. 即连接池中最大连接数为8. 当程序超过此连接数再获取连接时,就处于排队状态, 当排队超高maxWait(见2, 默认为) 时间,就抛出异常. 

通过查看连接池配置,发现配置如下,即最大连接为10 ,等待时间为10ms ,通过调整maxWait时间如改为5000(即5s),程序在超过连接10次后, 请求正好5s后,抛出异常. 

		   		datasource.setMaxActive(10);
		   		datasource.setMaxWait(10);
 
    /**
     * The maximum number of active connections that can be allocated from
     * this pool at the same time, or negative for no limit.
     */
    protected int maxActive = GenericObjectPool.DEFAULT_MAX_ACTIVE;

 

 -->

 

    /**
     * The default cap on the total number of active instances from the pool.
     * @see #getMaxActive
     */
    public static final int DEFAULT_MAX_ACTIVE  = 8;

  /**

     * The maximum number of milliseconds that the pool will wait (when there
     * are no available connections) for a connection to be returned before
     * throwing an exception, or <= 0 to wait indefinitely.
     */
    protected long maxWait = GenericObjectPool.DEFAULT_MAX_WAIT;

    /**
     * The default maximum amount of time (in milliseconds) the
     * {@link #borrowObject} method should block before throwing
     * an exception when the pool is exhausted and the
     * {@link #getWhenExhaustedAction "when exhausted" action} is
     * {@link #WHEN_EXHAUSTED_BLOCK}.
     * @see #getMaxWait
     * @see #setMaxWait
     */
    public static final long DEFAULT_MAX_WAIT = -1L;
 

 

maxWait默认为-1L ,一直等待.

maxActive和maxWait 设置需根据项目实际访问情况设置. 

 

2). minIdle: 

    /**
     * The minimum number of active connections that can remain idle in the
     * pool, without extra ones being created, or 0 to create none.
     */
    protected int minIdle = GenericObjectPool.DEFAULT_MIN_IDLE;

    /**
     * The default minimum number of "sleeping" instances in the pool
     * before before the evictor thread (if active) spawns new objects.
     * @see #getMinIdle
     * @see #setMinIdle
     */
    public static final int DEFAULT_MIN_IDLE = 0;

 最小空闲数,即:连接池中保持连接的最小数, 此属性越接近实际访问大小,效率越高. 默认为0,即无连接.

根据本项目实际情况设置为2.(项目为个人开发)

 

3). 关于对于未关闭连接的管理处理的参数:

removeAbandoned:  是否关闭未关闭的连接, 默认为false, 改为true ,即超过removeAbandonedTimeout的连接,进行强制关闭.

removeAbandonedTimeout: 默认为300(单位秒)即5分钟, 根据操作数据时间来判断, 由于本系统访问较小且无复杂操作,设置为30s

logAbandoned: 关闭连接是否记录日志, 默认为false,改为true.

源码如下:

 

public class AbandonedConfig {

    /**
     * Whether or not a connection is considered abandoned and eligible
     * for removal if it has been idle longer than the removeAbandonedTimeout
     */
    private boolean removeAbandoned = false;

   /**
     * Timeout in seconds before an abandoned connection can be removed
     */
    private int removeAbandonedTimeout = 300;

    /**
     * Determines whether or not to log stack traces for application code
     * which abandoned a Statement or Connection.
     */
    private boolean logAbandoned = false;
 

设置此组参数的意义:

程序在获取连接进行数据库操作时 ,当未关闭连接, 设置了此参数,可以强制关闭这些连接.

这样可以减少对数据库连接的占用. 但对于连接保持时间参数timeout值的设置,需要斟酌考虑.

 

总结: 数据库连接池给我们操作数据库带来了方便,通过配置可以关闭未关闭的连接, 但在程序中能根据业务处理完成后,关闭连接, 更合理些.

 

 

 

 

分享到:
评论
1 楼 taikeqi 2018-01-04  
要是我用mybatis,在何处关闭Connection?

相关推荐

    weblogic连接池配置数据库断掉重连的问题

    Weblogic 连接池配置数据库断掉重连的问题是一个非常重要的问题,需要进行详细的讨论和分析。在这个主题中,我们讨论了连接池配置的基本概念、断掉重连机制的原理、配置参数的解释等。通过了解这些知识点,我们可以...

    数据库连接池原理

    - 当执行一个SQL命令时,如果没有连接池,那么每次都需要经历完整的连接和断开过程,这包括TCP连接的三次握手、数据库认证的三次握手、SQL执行、数据库关闭以及TCP的四次挥手关闭。这种方式虽然实现简单,但是存在...

    构建高效的python requests长连接池详解

    6. **关闭无用连接**:虽然`requests`会自动管理连接,但在某些情况下,如服务器主动关闭连接或长时间无活动,可能需要手动关闭`Session`以释放资源。 7. **注意HTTP/2**:`requests`库从版本2.13.0开始支持HTTP/2...

    SQL Server asp.net 数据提供程序连接池.pdf

    **重要提醒**:在使用完毕后应及时关闭连接,确保其能及时归还至连接池,避免资源浪费。未显式关闭的连接可能不会立即被回收,特别是在达到最大池大小的情况下,这可能导致资源泄露。 #### 连接的移除 连接池管理...

    C3P0连接池jar包.rar

    在某些场景下,如果数据库服务器设置有会话超时,长时间未使用的DBCP连接可能会被数据库主动关闭,而应用并不知情,导致应用程序出现异常。因此,对于需要长时间保持连接的应用,C3P0的这一特性显得尤为重要。 在...

    DBCP连接池原理分析

    DBCP连接池默认情况下不会主动检测连接的有效性,这可能会导致以下问题: - **MySQL 8小时问题**:MySQL默认设置下,连接空闲8小时后会被自动断开,但DBCP连接池无法感知这一变化。 - **网络故障后的连接失效**:如...

    使用JAVA中的动态代理实现数据库连接池.rar_数据库连接池_连接池

    例如,如果连接长时间未被使用,连接池可能会主动关闭并回收它,防止资源浪费。此外,还可以实现线程安全的机制,确保并发环境下的正确性。 总结,使用Java的动态代理来实现数据库连接池,可以让我们在不改变原有...

    C3P0连接池.rar

    在Java应用程序中,频繁地创建和关闭数据库连接会消耗大量的系统资源,而连接池的出现解决了这个问题。C3P0连接池允许预先配置一定数量的数据库连接,并在需要时提供给多个线程共享使用,使用完毕后归还到连接池,而...

    Java实现Socket长连接和短连接

    在长连接中,一次连接可以处理多个请求,直到连接的某一方主动关闭或者因为网络问题被迫关闭。长连接能减少连接创建和关闭的开销,提高效率,但可能会消耗更多系统资源,尤其是服务器端。 实现Java Socket长连接的...

    CLOSE_WAIT网络连接无法释放问题解决

    这种情况经常出现于客户端主动断开连接,但服务器端没有正确关闭连接的情况下。这种情况可能会导致服务器端出现大量未释放的网络连接,影响系统性能。 CLOSE_WAIT状态的产生是由于TCP连接的结束流程未走完所致。在...

    swoole结合workerman的数据操作断线重连处理

    周期性地发送一个小的查询请求,如果连续几次得不到响应,可以主动断开连接并尝试重新连接。这有助于及时发现并解决潜在的网络问题。 总结起来,swoole和workerman都是强大的PHP扩展,它们提供了丰富的工具来处理...

    Mybatis破MySql8小时断线问题1

    描述中提到,当数据库连接闲置时间超过MySQL默认设定的8小时后,数据库会主动关闭这个连接。然而,如果使用JDBC或连接池的客户端仍尝试使用这个已断开的连接,就会引发异常。 MySQL的这个超时机制是由系统变量`wait...

    Mina实现长连接和短连接实例

    在创建长连接时,我们通常会维护一个连接池,客户端与服务器建立连接后,这个连接会在一段时间内保持活跃,除非出现错误或主动断开。这在需要频繁交互的应用场景中非常有用,例如HTTP/2、WebSocket和FTP服务。 在...

    网络游戏-实现网络长连接倒换的方法.zip

    4. **连接池管理**:在客户端,可以使用连接池来管理多个长连接,根据实际需求动态增减连接数。连接池能有效地管理和重用连接,减少新建和销毁连接的开销。 5. **容错与恢复机制**:在服务器端,需要有完善的错误...

    java远程telnet ftp和ssh连接的方法

    在Java编程语言中,远程连接技术对于系统集成、自动化运维以及网络管理等场景至关重要。...同时,确保在生产环境中使用安全的最佳实践,例如加密密码、避免硬编码敏感信息,并及时关闭连接以释放资源。

    采用jdbc连接Impala

    例如,使用Apache DBCP或HikariCP等连接池库可以有效地管理数据库连接,避免频繁创建和关闭连接。 总结起来,"采用jdbc连接Impala"涉及到的关键知识点包括: - JDBC接口的使用 - Impala JDBC驱动的安装和配置 - ...

    android 长连接推送

    2. 长连接:一旦建立连接,就保持连接状态,可以进行多次数据传输,直到连接因异常或主动关闭。长连接适用于需要持续通信的场景,如实时聊天、推送服务等。 二、Android长连接推送原理 Android长连接推送通常基于...

    hibernate3.0+c3p0 重新自动连接

    - 注意数据库的连接超时设置,避免因长时间无操作导致的连接被数据库服务器主动关闭。 通过以上的介绍,我们可以了解到`Hibernate3.0`与`c3p0`结合使用时,如何配置和利用`c3p0`的自动重连功能,以增强应用在面对...

    传递指定的参数建立websocket连接,并给指定的连接用户发送消息

    5. **关闭连接**: 当连接断开时,`afterConnectionClosed()`方法会被调用,这里可以清理与该连接相关的资源。 6. **拦截处理**: 如果有`WebSocketInterceptor`,则会在连接生命周期的关键点执行相应的拦截逻辑。 7...

Global site tag (gtag.js) - Google Analytics