开源数据库连接池之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检索的对象:
1 public class JdbcUtils { 2 3 private static DataSource ds = null; 4 5 static{ 6 try{ 7 8 Context initCtx = new InitialContext(); 9 Context envCtx = (Context)initCtx.lookup("java:comp/env"); 10 ds = (DataSource) envCtx.lookup("tomcatpool"); 11 //根据<Resource>元素的name属性值到JNDI容器中检索连接池对象 12 }catch (Exception e) { 13 throw new ExceptionInInitializerError(e); 14 } 15 } 16 17 public static Connection getConnection() throws SQLException { 18 return ds.getConnection(); //利用数据源获取连接 19 } 20 21 public static void release(Connection conn,Statement st,ResultSet rs) { 22 if(rs!=null) { 23 try{ 24 rs.close(); 25 }catch (Exception e) { 26 e.printStackTrace(); 27 } 28 } 29 if(st!=null) { 30 try{ 31 st.close(); 32 }catch (Exception e) { 33 e.printStackTrace(); 34 } 35 } 36 if(conn!=null) { 37 try{ 38 conn.close(); 39 }catch (Exception e) { 40 e.printStackTrace(); 41 } 42 } 43 } 44 }
View Code
这个工具类和之前的开源连接池差不多一样,在获取连接池和连接都是通过不同开源连接池的对象获取,而释放资源的代码一点都没有变,因此可以知道在Tomcat内置的连接池依然也是对数据库直接提供的Connection对象做了close方法的覆写,那么我们使用一个Servlet来看看Tomcat给我们提供的连接池是什么样子的:
1 public class TestServlet extends HttpServlet { 2 3 public void doGet(HttpServletRequest request, HttpServletResponse response) 4 throws ServletException, IOException { 5 6 Connection conn = null; 7 Statement st = null; 8 ResultSet rs = null; 9 try{ 10 conn = JdbcUtils.getConnection(); 11 response.getWriter().write(conn.toString()); 12 response.getWriter().write("<br>"); 13 response.getWriter().write(conn.getClass().getName()); 14 }catch (Exception e) { 15 throw new RuntimeException(e); 16 } 17 finally{ 18 JdbcUtils.release(conn, st, rs); 19 } 20 } 21 }
View Code
在浏览器中查看:
从Tomcat内置的连接池返回给我们的Connection对象来看,确实证实了Tomcat内置的连接池就是DBCP连接池。因此我们是一个WEB工程同时不想用其他的开源连接池的话就可以使用Tomcat的内置数据库连接池了。
转载于:https://www.cnblogs.com/fjdingsd/p/5273187.html
开源数据库连接池之Tomcat内置连接池相关推荐
- java tomcat连接池,tomcat容器的内置连接池怎么使用(按时结帐)
tomcat容器的内置连接池怎么使用(按时结帐) tomcat容器的内置连接池怎么使用(按时结帐) 日期:2014-05-18 浏览次数:20325 次 tomcat容器的内置连接池如何使用(按时结帐 ...
- 【⭐】Java—Spring-—数据库操作—使用内置连接池,报读取不到驱动错误。Could not load JDBC driver class。...
项目功能: 连接MySql数据库,向数据库插入一条数据 项目结构: DEBUG信息: DEBUG [main] - Destroying singletons in org.springframewo ...
- 关于Tomcat与MySQL连接池问题的详解
转载自 关于Tomcat与MySQL连接池问题的详解 研究了一天,终于有所收获,希望对大家有所帮助.首先请大家注意:这里尤其讨论Tomcat5.5版本中遇到的问题,为什么尤其单对这个版本,我一会儿 ...
- 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项
文章目录 线程池介绍 自己设计一个线程池 1.设计ThreadPool类: 2.设计工作队列 3.实现自己设计的线程池 用java的ThreadPoolExecutor自定义线程池 自定义线程池-参数 ...
- 自定义线程池-java内置线程池构造方法介绍
Java内置线程池原理剖析 我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池:这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理; Thread ...
- Java内置线程池ExecutorService介绍及商品秒杀案例
第一.ExecutorService接口是java内置的线程池接口,通过学习接口中的方法,可以快速的掌握java内置线程池的基本使用 常用方法: void shutdown() 启动一次顺序关闭,执行 ...
- java设计高并发内存池_高并发服务器-连接池的设计
高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...
- mysql连接池的工作原理_连接池工作原理
连接池工作原理 连接池技术的核心思想是连接复用,通过建立一个数据库连接池以及一套连接使用.分配和管理策略,使得该连接池中的连接可以得到高效.安全的复用,避免了数据库连接频繁建立.关闭的开销. 连接池的 ...
- java dbcp连接池 使用_Java使用DBCP连接池
DBCP 是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,commo ...
最新文章
- iOS中常见的图片压缩方法
- Python 在腾讯研发排第 5,鹅厂 2019 年新增 12.9 亿行代码
- 计算机编程语言python-初学者最容易学的六种编程语言
- 一个标准的PID算法
- supervisor进程管理工具
- 关于有序二维矩阵查找和字符串替换的两道算法题
- P5341-[TJOI2019]甲苯先生和大中锋的字符串【SAM】
- SQLSERVER压缩数据文件的用处有多大
- 小姐姐给我讲,一听就懂的财务报表
- [转载] 浅析Java中volatile关键字及其作用
- 一网打尽:14种预训练语言模型大汇总
- c语言中形参和实参的区别
- HSqlDB(java内置数据库)
- IP地址格式 点分十进制
- 伽罗华域(Galois Field,GF,有限域)乘法运算
- 增加对ARM64和X86的硬件预取控制驱动的支持
- 图像处理与机器视觉行业分析
- google的搜索技巧
- 模板模式详解、模板模式怎么用、模板模式模板代码
- SMM 框架整合 配置文件
热门文章
- startos 5.1 如何 root 登陆
- 图像处理之基于阈值模糊
- 数据库编程入门培训(二)
- 使用临界区 CRITICAL_SECTION 实现互斥
- dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3(十)之Spring MVC中使用 Swagger2 构建Restful API...
- Eclipse常用功能键
- sql 使用存储过程传递列名或表名作为参数
- 我马上会重新利用这个博客的
- fiddler抓取https请求
- 蓝桥杯 1427 买不到的数目 (模拟)