web java -- 连接池 -- 概述
1. 连接池的实现原理
1. 创建连接池
首先要创建一个静态的连接池。这里的“静态”是指池中的连接时在系统初始化时就分配好的,并且不能够随意关闭。Java 提供了很多容器类可用来构建连接池,例如Vector、Stack等。在系统初始化时,根据配置创建连接并放置在连接池中,以后所使用的连接都是从该连接池中获取的,这样就可以避免连接随意建立、关闭造成的开销。
2. 分配、释放策略
创建好连接池后,需要提供一套自定义的分配、创建策略以保证数据库连接的有效复用。当客户请求数据库连接时,首先看连接池中是否有空闲连接(目前没有分配出去的连接),如果存在空闲连接则把连接分配给客户,并做相应的处理;若连接池中没有空闲连接,就在已经分配出去的连接中,寻找一个合适的连接给客户,此时该连接在多个客户间复用。当客户释放数据库连接时,可以根据该连接是否被复用,进行不同的处理。如果连接没有使用者,就放入到连接池中,而不是关闭。
分配、释放策略对于有效复用连接非常重要。Reference Countiong(引用记数)时一种复用资源方面应用的非常广泛的方法,这里将该方法运用到对于连接的分配释放上。使用连接池时,为每一个数据库连接保留一个引用记数,用来记录该连接的使用者的个数。在具体的实现上,可以采用两级连接池:空闲池和使用池。空闲池中存放目前还没有分配出去被使用的连接,一旦一个连接被分配出去,那么就会放入到使用池中,并增加引用记数。这样做可以更高效地使用连接,一旦空闲池中的连接被全部分配出去,就可以根据相应的策略从使用池中挑选出一个已经正在使用的连接来复用,而不是随意拿出一个连接去复用。策略可以根据需要去选择,比较简单的做法时复用引用记数最小的连接。Java的面向对象特性,使得可以灵活地选择不同的策略(提供一个不同策略共用的抽象接口,各个具体的策略都实现这个接口,这样对于策略的处理逻辑和策略的实现逻辑分离)。
3. 配置策略
数据库连接池中到底要放置多少个连接,连接耗尽后应该如何处理,这就时配置策略需要解决的问题。在一般情况下,配置策略在开始时就根据具体的应用需求,给出一个初始的连接池中的连接的数目以及一个连接池可以扩张到的最大连接数目。
2. 在Tomcat上配置数据源与连接池
1. 配置Tomcat的连接池:配置Server.xml文件。首先打开\tomcat\conf目录下的Server.xml文件,然后在其</host>标签前面添加如下代码
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context>
<Resource name="jdbc/my_db"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/ch10"
username="root"
password="root"
maxActive="20"
maxIdle="10"
maxWait="-1"/>
</Context>
</Host>
path:制定路径。这里设定的时/CATALINA_HOME/webapps下的DBTest目录。
docBase : 制定应用程序文件根目录。
reloadable : 设定当网页被更新时是否重新编译。
maxActive : 设定连接池的最大数据库连接数,设为0标识没有连接数限制。
maxIdle : 设定数据库最大空闲时间,超过此空闲时间,数据库连接将被标记为不可用,然后被释放,设为0表示没有限制。
maxWait : 设定最大建立连接等待时间,如果超过此时间将接到异常,设为-1表示没有限制。
username : 访问数据库的用户名。
password : 访问数据库的密码。
driverClassName : 数据库的JDBC驱动程序名称。
url : 数据库连接串
2. 配置web服务:配置web.xml文件。
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/my_db</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
description : 对被引用资源的描述。
res-ref-name : 引用的资源名称。
res-type : 引用的资源的类型,这里时Server.xml中配置的数据源。
3. 编写测试页面Test.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.sql.*,javax.naming.*,java.sql.*" errorPage="" %>
<%@ page import="javax.sql.DataSource" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.print("使用连接池连接Derby数据库成功!<br>");//输出提示信息
out.println("<br>");
Context ctx = null;
DataSource ds = null;
Statement stmt = null;
ResultSet rs = null;
Connection con = null;
ResultSetMetaData md = null;
try{
ctx = new InitialContext(); ds = (DataSource)ctx.lookup("java:comp/env/jdbc/limeDB");//找到配置的数据源
con = ds.getConnection();//创建数据库连接
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT * FROM student");
md = rs.getMetaData();
out.print(md.getColumnLabel(1) + " ");
out.print(md.getColumnLabel(2) + " ");
out.print(md.getColumnLabel(3) + " ");
out.print(md.getColumnLabel(4) + "<br>");
while (rs.next()){
out.print(rs.getInt(1) + " ");
out.print(rs.getInt(2) + " ");
out.print(rs.getInt(3) + " ");
out.print(rs.getInt(4) + "<br>");
}
}catch (Exception e){
out.print(e);
}finally{
if(rs != null)rs.close();
if(stmt != null)stmt.close();
if(con != null)con.close();//断开数据库连接
if(ctx != null)ctx.close();//没有连接时,释放资源
}
%>
</body>
</html>
在Tomcat中配置好数据源后,Tomcat会将这个数据源绑定到JNDI名称空间,然后通过Context.lookup()方法来查找到这个数据源,找到数据源之后,使用getConnection()方法创建一个数据库连接,之后就可以像使用JDBC直接连接数据库那样操作数据库了。
注意:
记得释放资源,尤其时Context资源。
3. 配置连接池时需要注意的问题
1. 最小连接数时连接池一直保存的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2. 最大连接数时连接能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这回影响之后的数据库操作。
3. 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接,这些大于最小连接数的数据库连接在使用完之后不会马上被释放,而是被放到连接池中等待重复使用或是空闲超时后被释放。
啦啦啦
啦啦啦
啦啦啦
啦啦啦
啦啦啦
web java -- 连接池 -- 概述的更多相关文章
- c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一、连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程
c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一.连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 DB连接池HikariCP为什么如此快 原创: D ...
- 几个主流java连接池
池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...
- 转载: 几个主流的Java连接池整理
https://www.cnblogs.com/linjian/p/4831088.html 池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所 ...
- 几个主流的Java连接池整理
池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...
- Java 连接池的工作原理(转)
原文:Java 连接池的工作原理 什么是连接? 连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“. 有人接受这种说法,却不知道它的真正含义.因此,下面我将解释 ...
- [JavaEE] 了解Java连接池
转载自51CTO http://developer.51cto.com/art/201006/207768.htm 51CTO曾经为我们简单的介绍过Java连接池.要了解Java连接池我们先要了解数据 ...
- Redis Java连接池调研
Redis Java连接池调研 线上服务,由于压力大报错RedisTimeOut,但是需要定位到底问题出现在哪里? 查看Redis慢日志,slowlog get 发现耗时最大的也是11000us也就是 ...
- Java连接池详解
于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式正是为了解决资源的频繁分配﹑释放所造成的问题.为解决我们的问题,可以采用数据库连接池技术.数据库连接池的基本思想就是为数 ...
- 配置Java连接池的两种方式:tomcat方式以及spring方式
1. tomcat方式:在context.xml配置连接池,然后在web.xml中写配置代码(也能够在server.xml文件里配置连接池).这两种方法的差别是:在tomcat6版本号及以上中cont ...
随机推荐
- Java全栈程序员之01:做个Linux下的程序猿
Windows10正在成为史上口碑最差的Windows系统 (图侵删) 我曾经花了数次1小时去寻找解决方案去关闭自动更新,包括停掉服务.修改注册表等等.但是都没有成功. 微软自身是知道这个问题的,但就 ...
- quartus II输入原理图及仿真步骤
在Quartus II中输入原理图以及实现仿真是学习基本数字电路的好方法.下面以一个基本的D锁存器为例,在quartus II 13.0中一步一步来实现原理图输入以及仿真过程. 1,创建工程 指定工程 ...
- Redis集群规范
Redis集群规范 什么是 Redis 集群 分布式(distributed) 容错(fault-tolerant) 是普通单机 Redis 所能使用的功能的一个子集(subset). 集群的容错功能 ...
- 使用promise 和 generator来管理工作流
根据p219的代码改编 示例代码如下 function oneStep(value){ return new Promise(function(resolve, reject){ resolve('o ...
- Java 面试题 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- webservice-整理
webservice-整理 RPC与WebService的区别:https://blog.csdn.net/defonds/article/details/71641634 http://www.di ...
- apache2.4多站点配置
原来是跑单站,现在想跑多站,配置不算复杂,记录一下: 用默认的httpd.conf修改,去掉两个vhost的注释 servername指定任意一个合法的域名 如果是python,配置wsgi 修改ex ...
- Spark机器学习(9):FPGrowth算法
关联规则挖掘最典型的例子是购物篮分析,通过分析可以知道哪些商品经常被一起购买,从而可以改进商品货架的布局. 1. 基本概念 首先,介绍一些基本概念. (1) 关联规则:用于表示数据内隐含的关联性,一般 ...
- MongoDB 进程控制系列二:结束进程
1:如果某个进程产生了异常,可以考虑将其kill掉 db.killOp(10417) db.killOp(10417/*opid*/) 等同于: db.$cmd.sys.killop.findOne( ...
- TinyMCE与Domino集成
TinyMCE与Domino集成 一:TinyMCE简介 TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成.它对IE6+和Firefox1.5+都有着非常良好的支持 ...