数据库连接池原理(入门篇)

数据库连接池原理:

应用了资源池(resource pool)设计模式思想,为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

 

连接池要考虑的问题:

1.并发问题: 要考虑多线程环境,可以使用synchronized关键字确保线程的同步

    

2.多数据库服务:设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的url地址等信息。根据资源文件提供的信息,创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。

   多用户:对于同一个数据库有多个用户使用不同的名称和密码访问的情况,也可以通过资源文件处理,即在资源文件中设置多个具有相同url地址,但具有不同用户名和密码的数据库连接信息。

 

3.事务处理:java中connectinon类本省提供了对事务的支持,可以通过将autocommit属性设置为‘false’,然后通过显示调用commit()和rollback()方法实现;但要高效的进行connection复用,就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现,这种方法可以大大降低事务管理的复杂性;

 

4.连接池的分配与释放:

 对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。

每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接

YES: 建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);

No:检查当前所开连接池是否达到连接池所允许的最大连接数(maxconn)

Yes: 等待一定的时间(预定时间)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout 则返回空值(null)。

No: 新建一个连接

注:(1)系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。

(2)检测空闲连接的状态:①可开辟专门的线程定时检测 ②采取在分配前检测的方法,不开辟专门线程。

 

5.连接池的配置与维护

系统可采取设置最小连接数(minconn)和最大连接数(maxconn)来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数

最小连接数的大小,直接影响系统启动和系统响应的快慢。

通常设置:在开发时,设置较小的最小连接数,这样对开发来说方便一些;在实际使用时,设置较大的最小连接数,这样对访问客户来说速度会快些。

如何确保连接池中的最小连接数?有动态和静态两种策略。

动态策略:定时检测连接池,如果发现连接数量小于最小连接数,则补充相应数量的新连接以保证连接池的正常运转。

静态策略:发现空闲连接不够时再去检查。

如何最大连接数的设置?要看系统的访问量,可通过反复测试,找到最佳点。

posted @ 2017-03-29 15:56  简笔话_Golden  阅读(420)  评论(0编辑  收藏  举报