`
qdpurple
  • 浏览: 272664 次
  • 性别: 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?

相关推荐

    WebMagic 0.4.0 发布,Java爬虫框架

    修复0 3 2及之前版本连接池不生效的问题 #30 使用HttpClient 4 3 1新的连接池机制 实现连接复用功能 经测试 下载速度可达到90%左右的提升 测试代码:Kr36NewsModel java 二 增加同步抓取的API 对于小规模的抓取...

    代码客:G-Socket(IOCP) 1.0 (Server/Client)例程源码+Server体验程序+强大的压力测试工具

    (3)、内存管理:连接池(句柄重用)、内存池; (4)、数据0拷贝:通过内置处理线程,上层应用可以避免自建线程池及复制数据的过程。同时提供GBuf内存分配功能,应用层获得分配地址及填充数据之后亦可直接投递给内核/...

    分享蓝牙4.0防丢器源码+原理图+PCB源文件+视频讲解-电路方案

    连接采用设备端在连接后主动发起绑定请求的方式,当请求30秒未响应,则主动断开连接。采用确定和取消的方式,有需要可以修改为密码方式,防止别人连接你的防丢器。 提示音支持自定义铃声,只需要把想要的音乐的乐谱...

    TCP拦截和网络地址转换

    因此,它必然因为成千上万个连接的超时而要关闭这些连接。最终, 被攻击的主机资源被耗尽,主机也就没什么用处了。如果发送有足够数量的 S Y N报文,则某 些操作系统也会崩溃,并且需要重启系统。 这就是常见的D o ...

    华为编程开发规范与案例

    话单池的一个备份指针Pool_head_1和中继计次表的头指针重合,影响到第一个中继计次表的计费。 思考与启示: 随机值的背后往往隐藏着指针问题,两块内存缓冲区的交界处比较容易出现问题,在编程时是应该注意的地方...

    超级有影响力霸气的Java面试题大全文档

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...

    java 面试题 总结

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...

    IIS6.0 IIS,互联网信息服务

    为了安全,要对对每个目录按不同的用户设置不同的访问权限,然后关闭一些不需要的服务,这样可以对不良人士利用IIS溢出漏洞访问到系统盘作个第一级防护。 3.iis安全设置之端口设置。IIS有默认的端口设置,只要稍有...

    Windows内核安全与驱动开发光盘源码

    5.3.1 驱动主动通知应用 80 5.3.2 通信接口的测试 81 5.3.3 内核中的缓冲区链表结构 83 5.3.4 输入:内核中的请求处理中的安全检查 84 5.3.5 输出处理与卸载清理 85 第6章 64位和32位内核开发差异 88 6.1 64位...

    Windows内核安全驱动开发(随书光盘)

    5.3.1 驱动主动通知应用 80 5.3.2 通信接口的测试 81 5.3.3 内核中的缓冲区链表结构 83 5.3.4 输入:内核中的请求处理中的安全检查 84 5.3.5 输出处理与卸载清理 85 第6章 64位和32位内核开发差异 88 6.1 64位...

Global site tag (gtag.js) - Google Analytics