合理使用对象池可以大幅减少对象创建、初始化时间,连接池作为对象池的一种典型应用,虽不能减少数据库的物理连接数,但是却大大减少数据库连接的创建、初始化时间。关于数据库连接池的工作原理,这里作一简单说明:
1)初始化一个连接池管理器,DBConnectionPoolManager;
2)获取连接池,ConnectionPool,多个数据库会有多个connectionpools;
2)ConnectionPool负责创建、释放、回收连接;
3)连接池会有Thread在侦听连接是否有效、sql执行时间是否超标等;
Proxool作为一开源连接池,由于其支持多数据库且有强大的监控、统计功能,广受部分开发人员垂青,本人也不例外。
1、proxool何时创建连接,Proxool在下述2种情形下会创建连接:
1)程序显性获取数据库库连接时,比如getConnection时,此时proxool可能会创建连接。当无可用连接时,proxool便会即时创建一个连接,此时该连接状态为Active。
2)PrototyperThrea
当当前连接数小于最小连接数或者当前可用连接数小于最小可用连接数时,便会创建新连接,并将新建的连接状态置为Available.
2、执行sql语句时,proxool在做哪些事情
1)记录正在执行的sql语句;
2)记录开始执行时间,执行结束事件;
3)按不同的事件频率统计,sql语句平均耗时;
4)记录sql执行次数;
3、连接如何回收、销毁
HouseKeeperThread,该thread负责检查连接是否有效、连接sql执行时间是否超过最大activetime(默认5分钟),连接存活时间是否超过最大存活事件(默认4小时).
一个良好的程序员应该在获取数据库连接后及时释放连接,一旦有个别程序数据库连接不会释放,则连接池马上将达到最大连接数,并阻塞之后的所有数据库请求。
1)连接失效,proxool会根据预设的测试sql语句,通常是取数据库时间(select current_date)等,测试该连接是否可以正常工作,如果测试失败,则proxool会从连接池中移除该对象,并销毁;
2)sql执行时间大于maxactivetime
当遇上大数据量select语句,或者update大数据量索引表时,往往会耗时较长,如果一个sql语句其在maxactivetime时间内未执行完毕的话,proxool会将其强行关闭,从pool中移除,并销毁;
3)当连接建立时间到现在超过maxconnectionlife
HouseKeeperThread在run过程中发现,有个available连接其建立到现在已超过maxconnectionlife时,proxool会将其物理关闭,从pool中移除,并销毁,为了确保物理连接数最少。