分享

Tomcat7 新的数据库连接池Tomcat jdbc pool介绍和配置

 xfxyxh 2020-03-11
Tomcat 在 7.0 以前的版本都是使用commons-dbcp做为连接池的实现,但是 dbcp存在一些问题:
(1)dbcp 是单线程的,为了保证线程安全会锁整个连接池
(2)dbcp 性能不佳
(3)dbcp 太复杂,超过 60 个类,发展滞后。
因此,通常J2EE中还会使用其它的高性能连接池,如 C3P0,还有阿里系的 druid 等。为此,Tomcat 从 7.0 开始引入一个新的模块: Tomcat jdbc pool
tomcat jdbc pool 近乎兼容 dbcp ,性能更高
异步方式获取连接
tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架
使用 javax.sql.PooledConnection 接口获取连接
支持高并发应用环境
超简单,核心文件只有8个,比 c3p0 还少
更好的空闲连接处理机制
支持 JMX
支持 XA Connection。
tomcat jdbc pool 可在 Tomcat 中直接使用,也可以在独立的应用中使用。

1.Tomcat 中直接使用的方法:
在conf/server.xml下的<GlobalNamingResources>节点里配置resource,例如:

Xml代码 复制代码 收藏代码
  1. <Resource name="jdbc/ens"  
  2.       auth="Container"  
  3.       type="javax.sql.DataSource"  
  4.       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"  
  5.       testWhileIdle="true"  
  6.       testOnBorrow="true"  
  7.       testOnReturn="false"  
  8.       validationInterval="30000"  
  9.       timeBetweenEvictionRunsMillis="30000"  
  10.       maxActive="100"  
  11.       minIdle="10"  
  12.       maxWait="10000"  
  13.       initialSize="10"  
  14.       removeAbandonedTimeout="60"  
  15.       removeAbandoned="true"  
  16.       logAbandoned="true"  
  17.       minEvictableIdleTimeMillis="30000"  
  18.       jmxEnabled="true"  
  19.       jdbcInterceptors=  
  20. "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"  
  21.       username="root"  
  22.       password="123"  
  23.       driverClassName="com.mysql.jdbc.Driver"  
  24.       url="jdbc:mysql://localhost:3306/ens"/>  
  25.   
  26. 然后,在context.xml文件的<Context></Context>节点中添加如下配置:  
  27. <ResourceLink global="jdbc/ens" name="jdbc/ens" type="javax.sql.DataSource"/>  


global="jdbc/ens" 中的参数值("jdbc/ens")必须和上一段<Resource >配置中的name属性的值保持一样。name="jdbc/ens" 这个可以随便取,但是在程序中调用的时候,就应该与name的值保持一致。到这里,连接池已经配置好啦。

用JSP测试一下:

Html代码 复制代码 收藏代码
  1. <%@ page language="java" pageEncoding="gbk"%>  
  2. <%@page import="java.sql.Connection"%>  
  3. <%@page import="javax.naming.Context"%>  
  4. <%@page import="javax.naming.InitialContext"%>  
  5. <%@page import="javax.sql.DataSource"%>  
  6. <%@page import="java.sql.Statement"%>  
  7. <%@page import="java.sql.ResultSet"%>  
  8. <%  
  9.    //连接池的获取  
  10.     Connection conn = null;  
  11.     DataSource ds = null;  
  12.     ResultSet rs  =null;  
  13.     Statement stmt = null;  
  14.     Context initCtx = new InitialContext();  
  15.     ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/ens");  
  16.    if(ds!=null){  
  17.         out.println("已经获得DataSource!");  
  18.         out.println("<br>");  
  19.         conn = ds.getConnection();  
  20.        try{  
  21.         stmt = conn.createStatement();  
  22.         String sql ="select * from ens_area";  
  23.         rs = stmt.executeQuery(sql);  
  24.         out.println("以下是从数据库中读取出来的数据:<br>");  
  25.             while(rs.next()){  
  26.                 out.println("<br>");  
  27.                 out.println(rs.getString("area_name"));  
  28.             }  
  29.        }catch(Exception ex){  
  30.          ex.printStackTrace();  
  31.        }finally{  
  32.           conn.close();  
  33.           rs.close();  
  34.           stmt.close();  
  35.        }  
  36.    }  
  37.   
  38. %>  
分享到:
评论

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多