开源数据库连接池之Tomcat内置连接池
本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池。
之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式。这样能减少数据库创建连接的消耗。正是由于数据库连接池的思想非常重要,所以市面上也有很多开源的数据库连接池供我们使用。主要有以下三个:
DBCP数据库连接池
C3P0 数据库连接池
Tomcat内置的数据库连接池(DBCP)
本篇主要讲述C3P0数据库连接池的使用,关于另外两个数据库连接池的用法请看《开源数据库连接池之DBCP》 、《开源数据库连接池之C3P0》 。如果我们使用这些开源的数据库连接池,我们就可以省略像前一篇博客中自己创建数据库连接池的步骤,这样会省略我们很多事。
Tomcat服务器也内置了一个数据库连接池,当然这个数据库连接池其实也是一个DBCP数据库连接池。为什么?因为Tomcat和DBCP都是Apache公司的产品。
JNDI技术简单介绍
在学习Tomcat内置的连接池之前,我们先来认识下JNDI技术。
JNDI(Java Naming and Directory Interface),Java命名和目录接口,其对应于J2SE中的javax.naming包。
这个JNDI的作用在于,可以将一个Java对象放在容器(JNDI容器)中,并为存储的这个对象取一个名称,如果某个程序的方法要想获得这个对象,则使用JNDI并通过存储的名称检索即可获得。例如这个JNDI接口定义了Context接口,这是命名服务执行查询的入口,其lookup方法则为检索JNDI容器中的对象。对于Context来说,又代表了一个web应用,后面我们就会知道这两者的羁绊了。
Tomcat内置的数据库连接池
使用Tomcat服务器内置的数据库连接池的局限在于,一是这个工程必须是web工程,而不能是一般的Java工程;二是我们必须在服务器启用之前就要将数据库连接池配置好,这就要看情况了,如果我们在启用Tomcat之前没配置数据库连接池的话,那么后面的web应用一般也就不会使用内置的数据库连接池了,毕竟一般服务器不会随便停用。其实要想使用Tomcat内置的数据库连接池,也很简单,就将数据库的驱动jar包(例如mysql-connector-java-5.1.37.jar)放置在Tomcat的【lib】目录下。
有了数据库驱动后,接下来就是如何配置连接池的参数了,因为是要使用Tomcat服务器,因此这个配置也会和服务器相关。我们先来看看一段简单地配置参数代码:
这是一段相当于是设置Tomcat内置连接池的配置文件内容(当然作为示例参数没有设置太多),其中开头以<context>标签以及name和docBase属性是否十分熟悉?是的,我们在《Tomcat详细用法学习(二)》 和 《Tomcat详细用法学习(四)》 中都已经介绍过了,这个<context>标签在<Host>标签下,<Host>标签代表在服务器中设置的哪个虚拟主机,而<context>标签代表在某个虚拟主机下的某个具体的web应用,name属性指定这个web应用的名称,docBase属性指定该web应用的所在具体路径。也就是说如果我们要配置Tomcat连接池可以在server.xml文件中配置相应的连接池参数。
当然我们们在《Tomcat详细用法学习(二)》说过,尽量不要在Tomcat的【conf】目录中的server.xml文件中配置上面的<context>标签,因为每次配置都要重启服务器。当然也可以在Tomcat目录下【conf】-->【Catalina】-->【localhost】目录中,自建一个xml文件,再在里面写<context>标签内容,将上面图中的内容写进去,这也是《Tomcat详细用法学习(二)》提到过的。但这里我们任然不用这种要去服务器目录下设置的方法,我们最好的选择是在web应用中就能配置好自己的连接池参数。
那么最终我们使用在MyEclipse中创建web工程中的【WebRoot】下的【META-INF】目录里创建各自web的Tomcat内置连接池配置文件,并且这个文件必须命名为“context.xml”。
其实在Tomcat服务器的文档中就介绍了对于context的几种配置方式,这点在《Tomcat详细用法学习(二)》中介绍了,对于这次我们采用的方式Tomcat文档是这么介绍的:
也就是说我们在自己的web工程下的【META-INF】目录中创建一个“context.xml”文件,当web工程部署到Tomcat服务器时,服务器就会自动将这个“context.xml”配置文件复制到Tomcat目录下【conf】-->【Catalina】-->【localhost】目录下,同时将该文件重命名为以web工程名.xml的方式,就跟我们上面说的第二种方式一样。但这次我们无需再到Tomcat服务器下去创建xml文件,而是通过在自己应用下创建服务器会自动将我们的xml文件复制过去。
好了,我们已经说完了使用Tomcat内置连接池应该如何创建配置文件,配置文件的内容和配置文件应该放置的位置,现在就是如何使用的问题,我们之前说过JNDI定义了Context接口,是命名服务执行查询的入口,而这个接口的名字正好不就是我们要配置连接池参数的<context>元素吗,所以这里就说明了Tomcat内置连接池是要通过JNDI容器来检索的,而通过<Resource>元素的“name”属性作为在JNDI容器里检索的关键字。
Tomcat文档中也详细说明了如何使用内置的连接池:
注意是点击User Guide的第8点“JNDI Resources”而不是第9点。在“JNDI Resources”中详细介绍了JDBC Data sources:
例:根据上面的知识来简单地创建和使用Tomcat内置数据库连接池
首先在Tomcat目录中的【lib】目录下放入我们的数据库驱动jar包,这里我们使用的是MySQL数据库:
如果没有这一步最后程序将会抛出未找到com.mysql.jdbc.Driver的异常。
接着创建一个WEB工程,这里我们命名为“JdbcTomcatPool”,我们使用MySQL数据库中自定义的一个库,这个库我们命名为“jdbcdemo”。创建完web工程,那么在该工程的【META-INF】目录下创建一个“context.xml”文件:
配置文件中的内容如下:
- <Context>
- <Resource name="tomcatpool"
- auth="Container"
- type="javax.sql.DataSource"
- username="root"
- password="root"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/jdbcdemo"
- initialSize="10"
- maxActive="20"
- maxIdle="4"/>
- </Context>
这里<Resource>元素的name属性即为我们使用JNDI去检索的关键字,在本例中为“tomcatpool”。其他的参数都是配置连接池的设置,我们可以查看DBCP的参数(之前说过DBCP和Tomcat都是Apache的),也可以在Tomcat的文档查看JNDI Resources这个点里的JDBC Data sources这个文档都有详细的说明。
接下来我们跟以前的工程一样,创建一个数据库工具类JdbcUtils来简化对数据库的操作,注意,这里我们使用到了处理JNDI检索的对象:
- public class JdbcUtils {
- private static DataSource ds = null;
- static{
- try{
- Context initCtx = new InitialContext();
- Context envCtx = (Context)initCtx.lookup("java:comp/env");
- ds = (DataSource) envCtx.lookup("tomcatpool");
- //根据<Resource>元素的name属性值到JNDI容器中检索连接池对象
- }catch (Exception e) {
- throw new ExceptionInInitializerError(e);
- }
- }
- public static Connection getConnection() throws SQLException {
- return ds.getConnection(); //利用数据源获取连接
- }
- public static void release(Connection conn,Statement st,ResultSet rs) {
- if(rs!=null) {
- try{
- rs.close();
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- if(st!=null) {
- try{
- st.close();
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- if(conn!=null) {
- try{
- conn.close();
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
这个工具类和之前的开源连接池差不多一样,在获取连接池和连接都是通过不同开源连接池的对象获取,而释放资源的代码一点都没有变,因此可以知道在Tomcat内置的连接池依然也是对数据库直接提供的Connection对象做了close方法的覆写,那么我们使用一个Servlet来看看Tomcat给我们提供的连接池是什么样子的:
- public class TestServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- Connection conn = null;
- Statement st = null;
- ResultSet rs = null;
- try{
- conn = JdbcUtils.getConnection();
- response.getWriter().write(conn.toString());
- response.getWriter().write("<br>");
- response.getWriter().write(conn.getClass().getName());
- }catch (Exception e) {
- throw new RuntimeException(e);
- }
- finally{
- JdbcUtils.release(conn, st, rs);
- }
- }
- }
在浏览器中查看:
从Tomcat内置的连接池返回给我们的Connection对象来看,确实证实了Tomcat内置的连接池就是DBCP连接池。因此我们是一个WEB工程同时不想用其他的开源连接池的话就可以使用Tomcat的内置数据库连接池了。
开源数据库连接池之Tomcat内置连接池的更多相关文章
- Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池
连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...
- 使用Unidac内置连接池
第一步: 放一个TUniconnection并设置相关属性 之后直接使用TUniconnection对象即可 跟踪unidac源码uni单元1540行中可以看到 Connect方法调用CreateIC ...
- DBCP,C3P0与Tomcat jdbc pool 连接池的比较
hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置 ...
- c3p0、dbcp、tomcat jdbc pool 连接池配置简介及常用数据库的driverClass和驱动包
[-] DBCP连接池配置 dbcp jar包 c3p0连接池配置 c3p0 jar包 jdbc-pool连接池配置 jdbc-pool jar包 常用数据库的driverClass和jdbcUrl ...
- 在Tomcat中配置连接池和数据源
1.DataSource接口介绍 (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource ...
- Tomcat 的 JDBC 连接池
JDBC 连接池 org.apache.tomcat.jdbc.pool 是 Apache Commons DBCP 连接池的一种替换或备选方案. 那究竟为何需要一个新的连接池? 原因如下: Comm ...
- Tomcat上配置连接池{ connect error=Name [jdbc/OracleDB] is not bound in this Context. Unable to find [jdbc]}
. 在学习期间,从未实践过在tomcat上配置连接池,今天终于实现一次,在tomcat玩了一把,不知道你是否现在有和我一样的困境.废话少说直接上代码 java public static Con ...
- 配置tomcat全局c3p0连接池
由于项目中多个应用访问同一个数据库,并部署在同一个tomcat下面,所以没必要每个应用都配置连接池信息,这样可能导致数据库的资源分布不均,所以这种情况完全可以配置一个tomcat的全局连接池,所涉及应 ...
- tomcat内置jdk(tomcat集成jdk)(windows环境)
tomcat内置jdk,步骤: 1.在一个已经安装了jdk或者jre的机器上,拷贝一个jre到tomcat根目录下. 2.编辑tomcat/bin文件夹下的catalina.bat文件,在文件开头加上 ...
随机推荐
- BZOJ 1601 [Usaco2008 Oct]灌水
1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec Memory Limit: 162 MB Description Farmer John已经决定把水灌到他的n(1 ...
- Objective-C基础教程读书笔记(7)
第7章 深入了解Xcode Xcode是一个很好用的工具,有很多强大的功能,不过并不是所有的功能都易于发现.如果你打算长期使用这个强大的工具,就肯定要尽可能多了解它.本章将介绍一些Xcode编辑器的使 ...
- html里面自定义弹出窗口
网页上默认的提示框或对话框一般比较丑,可以利用div遮盖层来自定义对话框 1.定义一个按钮或者链接(项目里面是通过点击一个图片) <img src="images/zz.gif&quo ...
- POJ 1562(L - 暴力求解、DFS)
油田问题(L - 暴力求解.DFS) Description The GeoSurvComp geologic survey company is responsible for detecting ...
- (转)Free函数的参数一定要是malloc返回的那个指针
Free函数的参数一定要是malloc返回的那个指针 之前认为只要free的参数在malloc分配的区域之内就可以了, 现在发现不对的.在嵌入式里分配堆都是按照块来的,只要在这个块内系统就能识别, ...
- django email用法
在settings里面设置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'EMAIL_PORT = 25EMAIL_HOST ...
- 解决struts2中UI标签出现的问题: The Struts dispatcher cannot be found
解决struts2中UI标签出现的问题: The Struts dispatcher cannot be found 异常信息: The Struts dispatcher cannot be fou ...
- 九度OnlineJudge之1022:游船出租
题目描述: 现有公园游船租赁处请你编写一个租船管理系统.当游客租船时,管理员输入船号并按下S键,系统开始计时:当游客还船时,管理员输入船号并按下E键,系统结束计时.船号为不超过100的正整数. ...
- SDUTOJ 2128 树结构练习——排序二叉树的中序遍历
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUl9NaXNheWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- 云计算与虚拟化以及IaaS, PaaS和SaaS
概述: 包括:服务器虚拟化.桌面虚拟化.应用虚拟化: 云计算只是用到了虚拟化的技术: soa dubbo结构,阿里巴巴的开源架构: netstat -ntlp; 云服务”现在已经快成了一个家喻户晓的词 ...