传统的基于数据库的Web程序模式
-
主程序(
Servlet
,bean
)中建立数据库连接 -
进行
sql
操作 -
断开数据库连接
存在的问题
-
普通的JDBC数据库使用
DriverManager
获取,每次向数据库建立连接的时候都要将Connection
加载到内存中,在验证用户名和密码,通过了以后执行操作,执行完毕在断开连接 -
消耗大量的资源和时间,数据库的连接资源没有得到很好的重复利用
-
每一次数据库连接,使用完以后都得断开连接,如果程序出现异常未能关闭,导致数据库系统中的内存泄露,最终将导致数据库重启连接
-
不能控制被创建的连接对象数,连接过多会导致内存泄露,服务器崩溃。
Java
的内存泄露是指内存中存在对象不能被回收
C
的内存泄露是指指向内存区域的指针丢了
接触到的池:
-
字符串常量池
-
线程池
-
数据库连接池
数据库连接池技术
数据库连接池的基本思想:
为数据库连接建立一个"缓冲池",与现在缓存池当中存放一定数量的连接。需要建立连接时先从"缓冲池"取一个出来,用完再放回去。
数据库连接池的作用:
-
分配、管理、释放数据库连接。
-
允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个
数据库连接池的特点:
-
初始化时创建一定数量的数据库连接,这些连接的数量由最小数据库连接数确定。最大数据库连接数量限定了这个连接池能占有的最大连接数。
-
当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中
数据库连接池原理
-
开始预设几个数据库连接线程。线程状态为
free
-
每有一个线程进行占用链接状态就会由
free
变成busy
-
使用完成以后调用方法
Connection.close()
将连接状态由busy
又变为free
--->归还的时候修改事务提交的状态为自动提交 -
超过连接池数量的线程访问数据库连接,进行等待
多种开源的数据库连接池
特点:
-
JDBC的数据库连接池用
javax.sql.DataSource
表示,DataSource
只是一个接口 -
DataSource
接口由服务器(`Weblogic, WebSpher,Tomcat)和一些开源组织提供实现:-
DBCP:Apache提供的数据库连接池,
Tomcat
服务器自带dbcp
数据库连接池,速度相对c3p0
较快,但自身存在Bug
,Hibernate3
已经不再提供支持。--->主要讲 -
C3P0:一个开源组织提供的数据库连接池,速度相对较慢,稳定性可以。
Hibernate
官方推荐使用--->主要讲 -
Proxool:
Sourceforge
下的一个开源项目,能监控连接池状态,稳定性比C3P0差一些 -
BoneCP:开源组织提供,速度快
-
Druid:阿里提供的数据库连接池,速度不确定是否有
BoneCP
快--->主要讲
-
-
DataSource
通常被称为数据源,包含连接池和连接池管理。习惯上把DataSource
称为连接池 -
DataSource
用来取代DriverManager
来获取Connection