JIVE论坛分析 - 简单数据库连接池设计

来源:互联网 发布:广东软件企业认定 编辑:程序博客网 时间:2024/06/10 03:55

首先给出设计图

 

DataSourceConnectionProvider

 

    这个类就不用讲了,直接绑定JNDI数据源,执行代码是

 

 

首先DataSource名字的绑定记得灵活配置放在XML或者Properties中。是重要的是运行InitialContext是要环境支持JNDI。

 

 

DbConnectionDefaultPool

 

呵呵,这个类者是重头戏。

第一步,基本的数据库配置。包括最大连接数,最小连接池,连接超时时间等。

第二步,先创建一个最小的连接的大小,代码段如下:

 

 

 

这边要说明一个就是for currConnections这年循环就是创建初始化的连接数了,但是,为什么还要再加上一个外循环for dbLoop呢。

因为数据库当中可能出现已经连接满了,我们创建不了所要初始化的连接数,比如说3,当你创建了2个后,此时数据库连接已满,或者此时网络堵塞,你可能连接超时,创建不了刚刚好的3个连接,于是就会抛出异常,解决的办法是先等待一下。再次进入循环尝试下次的连接。

数据库连接。

这边地方要说一下关于创建时间这边有一个建议就是写一个Timer。每一秒去执行一次获取系统时间。实际上执行

System.currentTimeMillis()是比较消耗资源的。像这边需要轮询如果经常要获取系统时间。允许时间差的情况下。建议使用Timer去更新系统时间。

上面代码段是关于数据库连接池的创建的。数据库连接池的调用哪下

 

connLast这个变量是用来计算上次取得连接的位置。因为这边是用数据库连接池缓存对象是数组。这边有一个for outerloop主要是考虑一个情况,你所创建的所有连接都被使用,并且无法再次创建新连接的时候怎么办。这个时候就要考虑一下使用外循环去尝试一下连接。

 

再接下来是轮询数据库连接池,检测状态,将使用过长的连接要去掉。代码如下:

这边学习还是那个时间计算问题。最好写个Timer去更新时间,并将那个时间做为系统时间。

这边用了代码connPool[i].createStatement()去判定系统的连接正常执行,connPool[i].isClosed()这边多了个注释就是

// Some DBs return an object even if DB is shut down

这一句还不是很明白他的意思

 

这边使用ConnectionWrapper这个类去代理数据库的close事件。继承代理的效率可要比动态代理的效率高多了。