本篇介绍几种开源数据库连接池,同时重点讲述如何使用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内置连接池相关推荐

  1. java tomcat连接池,tomcat容器的内置连接池怎么使用(按时结帐)

    tomcat容器的内置连接池怎么使用(按时结帐) tomcat容器的内置连接池怎么使用(按时结帐) 日期:2014-05-18 浏览次数:20325 次 tomcat容器的内置连接池如何使用(按时结帐 ...

  2. 【⭐】Java—Spring-—数据库操作—使用内置连接池,报读取不到驱动错误。Could not load JDBC driver class。...

    项目功能: 连接MySql数据库,向数据库插入一条数据 项目结构: DEBUG信息: DEBUG [main] - Destroying singletons in org.springframewo ...

  3. 关于Tomcat与MySQL连接池问题的详解

    转载自   关于Tomcat与MySQL连接池问题的详解 研究了一天,终于有所收获,希望对大家有所帮助.首先请大家注意:这里尤其讨论Tomcat5.5版本中遇到的问题,为什么尤其单对这个版本,我一会儿 ...

  4. 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项

    文章目录 线程池介绍 自己设计一个线程池 1.设计ThreadPool类: 2.设计工作队列 3.实现自己设计的线程池 用java的ThreadPoolExecutor自定义线程池 自定义线程池-参数 ...

  5. 自定义线程池-java内置线程池构造方法介绍

    Java内置线程池原理剖析 我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池:这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理; Thread ...

  6. Java内置线程池ExecutorService介绍及商品秒杀案例

    第一.ExecutorService接口是java内置的线程池接口,通过学习接口中的方法,可以快速的掌握java内置线程池的基本使用 常用方法: void shutdown() 启动一次顺序关闭,执行 ...

  7. java设计高并发内存池_高并发服务器-连接池的设计

    高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...

  8. mysql连接池的工作原理_连接池工作原理

    连接池工作原理 连接池技术的核心思想是连接复用,通过建立一个数据库连接池以及一套连接使用.分配和管理策略,使得该连接池中的连接可以得到高效.安全的复用,避免了数据库连接频繁建立.关闭的开销. 连接池的 ...

  9. java dbcp连接池 使用_Java使用DBCP连接池

    DBCP 是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,commo ...

最新文章

  1. iOS中常见的图片压缩方法
  2. Python 在腾讯研发排第 5,鹅厂 2019 年新增 12.9 亿行代码
  3. 计算机编程语言python-初学者最容易学的六种编程语言
  4. 一个标准的PID算法
  5. supervisor进程管理工具
  6. 关于有序二维矩阵查找和字符串替换的两道算法题
  7. P5341-[TJOI2019]甲苯先生和大中锋的字符串【SAM】
  8. SQLSERVER压缩数据文件的用处有多大
  9. 小姐姐给我讲,一听就懂的财务报表
  10. [转载] 浅析Java中volatile关键字及其作用
  11. 一网打尽:14种预训练语言模型大汇总
  12. c语言中形参和实参的区别
  13. HSqlDB(java内置数据库)
  14. IP地址格式 点分十进制
  15. 伽罗华域(Galois Field,GF,有限域)乘法运算
  16. 增加对ARM64和X86的硬件预取控制驱动的支持
  17. 图像处理与机器视觉行业分析
  18. google的搜索技巧
  19. 模板模式详解、模板模式怎么用、模板模式模板代码
  20. SMM 框架整合 配置文件

热门文章

  1. startos 5.1 如何 root 登陆
  2. 图像处理之基于阈值模糊
  3. 数据库编程入门培训(二)
  4. 使用临界区 CRITICAL_SECTION 实现互斥
  5. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3(十)之Spring MVC中使用 Swagger2 构建Restful API...
  6. Eclipse常用功能键
  7. sql 使用存储过程传递列名或表名作为参数
  8. 我马上会重新利用这个博客的
  9. fiddler抓取https请求
  10. 蓝桥杯 1427 买不到的数目 (模拟)