Tomcat7 新的數據庫連接池Tomcat jdbc pool介紹和配置

jopen 12年前發布 | 160K 次閱讀 Tomcat7 Tomcat 應用服務器

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,例如:

<Resource name="jdbc/ens"
      auth="Container"
      type="javax.sql.DataSource"
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      testWhileIdle="true"
      testOnBorrow="true"
      testOnReturn="false"
      validationInterval="30000"
      timeBetweenEvictionRunsMillis="30000"
      maxActive="100"
      minIdle="10"
      maxWait="10000"
      initialSize="10"
      removeAbandonedTimeout="60"
      removeAbandoned="true"
      logAbandoned="true"
      minEvictableIdleTimeMillis="30000"
      jmxEnabled="true"
      jdbcInterceptors=
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
      username="root"
      password="123"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/ens"/>


然后,在context.xml文件的<Context></Context>節點中添加如下配置:

<ResourceLink global="jdbc/ens" name="jdbc/ens" type="javax.sql.DataSource"/>


global="jdbc/ens" 中的參數值("jdbc/ens")必須和上一段<Resource >配置中的name屬性的值保持一樣。name="jdbc/ens" 這個可以隨便取,但是在程序中調用的時候,就應該與name的值保持一致。到這里,連接池已經配置好啦。

用JSP測試一下:

<%@ page language="java" pageEncoding="gbk"%>
<%@page import="java.sql.Connection"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.ResultSet"%>
<%
   //連接池的獲取
    Connection conn = null;
    DataSource ds = null;
    ResultSet rs  =null;
    Statement stmt = null;
    Context initCtx = new InitialContext();
    ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/ens");
   if(ds!=null){
        out.println("已經獲得DataSource!"); 
        out.println("<br>");
        conn = ds.getConnection();
       try{
        stmt = conn.createStatement();
        String sql ="select * from ens_area";
        rs = stmt.executeQuery(sql);
        out.println("以下是從數據庫中讀取出來的數據:<br>");
            while(rs.next()){
                out.println("<br>");
                out.println(rs.getString("area_name"));
            }
       }catch(Exception ex){
         ex.printStackTrace();
       }finally{
          conn.close();
          rs.close();
          stmt.close();
       }
   }
%>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!