前言
数据库连接是一种昂贵的资源,当有多个用户访问网页的时候,对程序的性能与稳定性都有要求。数据库连接池就是为了解决这个问题的,数据库连接池负责创建、管理并释放连接。连接池中的连接可以被多个程序使用,这样就降低了创建数据库连接的开销。数据库连接池的原理也很简单,就是首先在内存存放一定数量的数据库连接,当请求的时候就从连接池中获取一个连接,该请求用完数据库连接后就会释放,于是这个连接就可以被其他程序请求。可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。
自己实现一个数据库连接池
目前主流的数据库连接池有dbcp、c3p0和proxool。其实现原理与上面都差不多,为了更好理解数据库连接池,我们手写一个连接池:
创建db.properties配置文件
然后编写主程序测试各功能是否正常:
可以发现,默认连接池有5个连接对象,在释放第一个连接后,连接池仍然有5个连接,所以在程序中创建第6个连接的时候没有报错。
当然这个程序问题很多,比如不能高访问量的情况,而且是单线程的。实际情况应该是,当用户请求一个连接的时候应该创建一个线程处理,这个线程决定该连接何时释放给连接池。通过上面的简单程序,知道了连接池管理数据库连接的原理。下面我们再看看第三方的数据库连接池的使用。
Tomcat7 jdbc pool
要知道在Tomcat7以前的版本中,使用的都是dbcp连接池,但是这个连接池bug太多,Hibernate官方宣布已经不再支持dbcp连接池dbcp连接池的主要问题:
- dbcp 是单线程的,为了保证线程安全会锁整个连接池
- jdk1.6编译有问题
- 结构太复杂
而jdbc pool在克服以上缺点的情况下,还增加了许多优良特性,详情请看这里
其中涉及的异步方式获取连接暂时还不懂,先来学习一下如何在独立的应用中获取连接。首先需要导入Tomcat7官方给的两个jar包:
tomcat-juli.jar(Tomcat的日志模块,在bin目录下)
tomcat-jdbc.jar(jdbc pool连接池,在lib目录下)
运行结果如下:
jdbc pool 小结
使用这个数据库连接池主要就是设置相关属性,再通过数据源就可以获取连接对象了。由于进行了封装处理,所以不需要自己释放连接。这里通过properties资源文件设置数据库相关的连接属性,这样做的目的不需要修改源代码,提高程序的健壮性。