讨论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值的设置,需要斟酌考虑.
总结: 数据库连接池给我们操作数据库带来了方便,通过配置可以关闭未关闭的连接, 但在程序中能根据业务处理完成后,关闭连接, 更合理些.
分享到:
相关推荐
Weblogic 连接池配置数据库断掉重连的问题是一个非常重要的问题,需要进行详细的讨论和分析。在这个主题中,我们讨论了连接池配置的基本概念、断掉重连机制的原理、配置参数的解释等。通过了解这些知识点,我们可以...
- 当执行一个SQL命令时,如果没有连接池,那么每次都需要经历完整的连接和断开过程,这包括TCP连接的三次握手、数据库认证的三次握手、SQL执行、数据库关闭以及TCP的四次挥手关闭。这种方式虽然实现简单,但是存在...
6. **关闭无用连接**:虽然`requests`会自动管理连接,但在某些情况下,如服务器主动关闭连接或长时间无活动,可能需要手动关闭`Session`以释放资源。 7. **注意HTTP/2**:`requests`库从版本2.13.0开始支持HTTP/2...
**重要提醒**:在使用完毕后应及时关闭连接,确保其能及时归还至连接池,避免资源浪费。未显式关闭的连接可能不会立即被回收,特别是在达到最大池大小的情况下,这可能导致资源泄露。 #### 连接的移除 连接池管理...
在某些场景下,如果数据库服务器设置有会话超时,长时间未使用的DBCP连接可能会被数据库主动关闭,而应用并不知情,导致应用程序出现异常。因此,对于需要长时间保持连接的应用,C3P0的这一特性显得尤为重要。 在...
DBCP连接池默认情况下不会主动检测连接的有效性,这可能会导致以下问题: - **MySQL 8小时问题**:MySQL默认设置下,连接空闲8小时后会被自动断开,但DBCP连接池无法感知这一变化。 - **网络故障后的连接失效**:如...
例如,如果连接长时间未被使用,连接池可能会主动关闭并回收它,防止资源浪费。此外,还可以实现线程安全的机制,确保并发环境下的正确性。 总结,使用Java的动态代理来实现数据库连接池,可以让我们在不改变原有...
在Java应用程序中,频繁地创建和关闭数据库连接会消耗大量的系统资源,而连接池的出现解决了这个问题。C3P0连接池允许预先配置一定数量的数据库连接,并在需要时提供给多个线程共享使用,使用完毕后归还到连接池,而...
在长连接中,一次连接可以处理多个请求,直到连接的某一方主动关闭或者因为网络问题被迫关闭。长连接能减少连接创建和关闭的开销,提高效率,但可能会消耗更多系统资源,尤其是服务器端。 实现Java Socket长连接的...
这种情况经常出现于客户端主动断开连接,但服务器端没有正确关闭连接的情况下。这种情况可能会导致服务器端出现大量未释放的网络连接,影响系统性能。 CLOSE_WAIT状态的产生是由于TCP连接的结束流程未走完所致。在...
周期性地发送一个小的查询请求,如果连续几次得不到响应,可以主动断开连接并尝试重新连接。这有助于及时发现并解决潜在的网络问题。 总结起来,swoole和workerman都是强大的PHP扩展,它们提供了丰富的工具来处理...
描述中提到,当数据库连接闲置时间超过MySQL默认设定的8小时后,数据库会主动关闭这个连接。然而,如果使用JDBC或连接池的客户端仍尝试使用这个已断开的连接,就会引发异常。 MySQL的这个超时机制是由系统变量`wait...
在创建长连接时,我们通常会维护一个连接池,客户端与服务器建立连接后,这个连接会在一段时间内保持活跃,除非出现错误或主动断开。这在需要频繁交互的应用场景中非常有用,例如HTTP/2、WebSocket和FTP服务。 在...
4. **连接池管理**:在客户端,可以使用连接池来管理多个长连接,根据实际需求动态增减连接数。连接池能有效地管理和重用连接,减少新建和销毁连接的开销。 5. **容错与恢复机制**:在服务器端,需要有完善的错误...
在Java编程语言中,远程连接技术对于系统集成、自动化运维以及网络管理等场景至关重要。...同时,确保在生产环境中使用安全的最佳实践,例如加密密码、避免硬编码敏感信息,并及时关闭连接以释放资源。
例如,使用Apache DBCP或HikariCP等连接池库可以有效地管理数据库连接,避免频繁创建和关闭连接。 总结起来,"采用jdbc连接Impala"涉及到的关键知识点包括: - JDBC接口的使用 - Impala JDBC驱动的安装和配置 - ...
2. 长连接:一旦建立连接,就保持连接状态,可以进行多次数据传输,直到连接因异常或主动关闭。长连接适用于需要持续通信的场景,如实时聊天、推送服务等。 二、Android长连接推送原理 Android长连接推送通常基于...
- 注意数据库的连接超时设置,避免因长时间无操作导致的连接被数据库服务器主动关闭。 通过以上的介绍,我们可以了解到`Hibernate3.0`与`c3p0`结合使用时,如何配置和利用`c3p0`的自动重连功能,以增强应用在面对...
5. **关闭连接**: 当连接断开时,`afterConnectionClosed()`方法会被调用,这里可以清理与该连接相关的资源。 6. **拦截处理**: 如果有`WebSocketInterceptor`,则会在连接生命周期的关键点执行相应的拦截逻辑。 7...