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,例如:html
<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>節點中添加以下配置:java
<ResourceLink global="jdbc/ens" name="jdbc/ens" type="javax.sql.DataSource"/>
global="jdbc/ens" 中的參數值("jdbc/ens")必須和上一段<Resource >配置中的name屬性的值保持同樣。name="jdbc/ens" 這個能夠隨便取,可是在程序中調用的時候,就應該與name的值保持一致。到這裏,鏈接池已經配置好啦。mysql
用JSP測試一下:sql
<%@ 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(); } } %>