一.早期咱们怎么进行数据库操做html
1.原理:通常来讲,java应用程序访问数据库的过程是:java
①装载数据库驱动程序;web
②经过jdbc创建数据库链接;sql
③访问数据库,执行sql语句;数据库
④断开数据库链接。设计模式
2.代码tomcat
Public void FindAllUsers(){服务器
//一、装载sqlserver驱动对象
DriverManager.registerDriver(new SQLServerDriver());
//二、经过JDBC创建数据库链接
Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");
//三、建立状态
Statement state =con.createStatement();
//四、查询数据库并返回结果
ResultSet result =state.executeQuery("select * from users");
//五、输出查询结果
while(result.next()){
System.out.println(result.getString("email"));
}
//六、断开数据库链接
result.close();
state.close();
con.close();
} 并发
3.分析ide
程序开发过程当中,存在不少问题:首先,每一次web请求都要创建一次数据库链接。创建链接是一个费时的活动,每次都得花费0.05s~1s的时间,并且系统还要分配内存资源。这个时间对于一次或几回数据库操做,或许感受不出系统有多大的开销。但是对于如今的web应用,尤为是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种状况下,频繁的进行数据库链接操做势必占用不少的系统资源,网站的响应速度一定降低,严重的甚至会形成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库链接,使用完后都得断开。不然,若是程序出现异常而未能关闭,将会致使数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被建立的链接对象数,系统资源会被毫无顾及的分配出去,如链接过多,也可能致使内存泄漏,服务器崩溃。
上述的用户查询案例,若是同时有1000人访问,就会不断的有数据库链接、断开操做:
经过上面的分析,咱们能够看出来,“数据库链接”是一种稀缺的资源,为了保障网站的正常使用,应该对其进行妥善管理。其实咱们查询完数据库后,若是不关闭链接,而是暂时存放起来,当别人使用时,把这个链接给他们使用。就避免了一次创建数据库链接和断开的操做时间消耗。原理以下:
二. 技术演进出来的数据库链接池
由上面的分析能够看出,问题的根源就在于对数据库链接资源的低效管理。咱们知道,对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为了解决资源的频繁分配﹑释放所形成的问题。为解决上述问题,能够采用数据库链接池技术。数据库链接池的基本思想就是为数据库链接创建一个“缓冲池”。预先在缓冲池中放入必定数量的链接,当须要创建数据库链接时,只需从“缓冲池”中取出一个,使用完毕以后再放回去,链接是是比较耗内存的。咱们能够经过设定链接池最大链接数来防止系统无尽的与数据库链接。更为重要的是咱们能够经过链接池的管理机制监视数据库的链接的数量﹑使用状况,为系统开发﹑测试及性能调整提供依据。
咱们本身尝试开发一个链接池,来为上面的查询业务提供数据库链接服务:
① 编写class 实现DataSource 接口
② 在class构造器一次性建立10个链接,将链接保存LinkedList中
③ 实现getConnection 从 LinkedList中返回一个链接
④ 提供将链接放回链接池中方法
一、链接池代码
public class MyDataSource implements DataSource {
//链表 --- 实现栈结构
privateLinkedList<Connection> dataSources = new LinkedList<Connection>();
//初始化链接数量
publicMyDataSource() {
//一次性建立10个链接
for(int i = 0; i < 10; i++) {
try {
//一、装载sqlserver驱动对象
DriverManager.registerDriver(new SQLServerDriver());
//二、经过JDBC创建数据库链接
Connection con =DriverManager.getConnection(
"jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");
//三、将链接加入链接池中
dataSources.add(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
publicConnection getConnection() throws SQLException {
//取出链接池中一个链接
finalConnection conn = dataSources.removeFirst(); // 删除第一个链接返回
returnconn;
}
//将链接放回链接池
publicvoid releaseConnection(Connection conn) {
dataSources.add(conn);
}
}
实例参考:http://www.javashuo.com/article/p-svdysxly-gh.html (包括代码和讲解)
java中几种常见数据库链接池的使用比较
一 开源数据链接池
1 dbcp
dbcp多是使用最多的开源链接池,缘由大概是由于配置方便,并且不少开源和tomcat应用例子都是使用的这个链接池吧。
这个链接池能够设置最大和最小链接,链接等待时间等,基本功能都有。这个链接池的配置参见附件压缩包中的:dbcp.xml
使用评价:在具体项目应用中,发现此链接池的持续运行的稳定性仍是能够,不过速度稍慢,在大并发量的压力下稳定性
有所降低,此外不提供链接池监控
2 c3p0
c3p0是另一个开源的链接池,在业界也是比较有名的,这个链接池能够设置最大和最小链接,链接等待时间等,基本功能都有。
这个链接池的配置参见附件压缩包中的:c3p0.xml。
使用评价:在具体项目应用中,发现此链接池的持续运行的稳定性至关不错,在大并发量的压力下稳定性也有必定保证,
此外不提供链接池监控。
3 proxool
proxool这个链接池可能用到的人比较少,但也有必定知名度,这个链接池能够设置最大和最小链接,链接等待时间等,基本功能都有。
这个链接池的配置参见附件压缩包中的:proxool.xml。
使用评价:在具体项目应用中,发现此链接池的持续运行的稳定性有必定问题,有一个须要长时间跑批的任务场景任务,一样的代码
4.Druid
阿里出品,淘宝和支付宝专用数据库链接池,但它不只仅是一个数据库链接池,它还包含一个,一系列内置的JDBC组件库,一个SQL Parser
。支持全部JDBC兼容的数据库,包括Oracle、MySql、SQL Server
Druid是目前最好的数据库链接池,在功能、性能、扩展性方面,都超过其余数据库链接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。
详情参考:https://blog.csdn.net/huanbinzhou333/article/details/5785838