根源:数据库连接资源的低效管理
对于一些共享的资源,我们一般使用“资源池”,目的是为了解决 资源频繁的分配和释放所带来的负面影响,对于数据库连接问题,我们知道, 创建数据库连接是要消耗大量的资源,为了解决这个问题,我们引入了数据库“资源池”也叫数据库连接池。
简单来说就是预先创建好一部分连接connection对象放到一个容器中,当我们要连接的时候往容器里面拿,当用完了的时候就放回去,我们还可以设定容器(所说的 池)能放的最大的连接数,这样可以防止系统无尽的与数据库连接,我们可以使用一些机制,来管理容器中连接connection的数量,使用情况,为系统开发,测试以及性能调优提供依据。
设计数据库连接池要点如下:
并发问题:我们可以通过java提供的并发机制,在获取连接时使用synchronization关键字, 如 public synchronized Connection getConnection();
多数据库服务器和多用户:对于大型企业级应用,常常需要同时连接不同的数据库,我们采用的是:设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建的时候读取一个资源文件,其中资源文件中存放着多个数据库的url username password ,根据资源文件提供的信息,创建多个连接池类的实例(有多少个url username password就创建多少个),每个实例都是一个特定的数据库的连接池。连接池管理类实例为每一个连接池取一个名字,通过不同名字来管理不同的连接池。
事务处理:事务(成功则成功,失败则失败)具有原子性,在java中Connection类本身就提供了对事务的支持,我可通过设置Connection 的AutoCommit属性来显示的调用Commit和rollback方法,但是为了高效的Connection服用,就必须有相应的事务支持机制,一般采用一个事务独占一个连接,这种方式大大降低事务管理的复杂性。
连接池的分配和释放:合理的分配和释放,可以提高连接的复用度,减低建立新连接的开销,还可以加快用户访问的速度,因此,我们可以采用“空闲池”,把已经创建好但是还没有被使用的连接按时间先后放到一个容器中(空闲池),当用户请求一个连接时,系统先检查空闲池中有没有可使用的连接,如果有,就把建立时间最长的那个连接分配出去(之前要检查这个连接是不是有效的),如果空闲池中没有,就检查当前连接池是不是达到了最大连接数,如果没有达到,就建立一个新的 连接,如果达到了,就在一个队列中等待,如果在等待的时间内有连接被释放,则可以使用这个连接,如果等待超时者返回null。
连接池的配置和维护:连接池到底该放多少个连接,才能性能达到最佳,系统可采用最大和最小连接数来控制,最小连接数十系统启动时在连接池所创建连接的数量,如果过大,在启动就变慢,一旦创建后响应的速度就快,反之亦然,一般在开发中设置较小的连接数,而在系统实际的使用时设置较大,(原因不说明自己能理解) 最大连接数是连接池中允许最大连接的数目,具体设置要看实际情况(用户的访问量) ,一般可以通过反复测试,来找到这个值 。