Tomcat 在 7.0 以前的版本都是使用commons-dbcp做為連接池的實(shí)現(xiàn),,但是 dbcp存在一些問題:
(1)dbcp 是單線程的,,為了保證線程安全會鎖整個連接池
(2)dbcp 性能不佳
(3)dbcp 太復(fù)雜,超過 60 個類,,發(fā)展滯后,。
因此,通常J2EE中還會使用其它的高性能連接池,,如 C3P0,,還有阿里系的 druid 等。為此,,Tomcat 從 7.0 開始引入一個新的模塊: Tomcat jdbc pool
tomcat jdbc pool 近乎兼容 dbcp ,,性能更高
異步方式獲取連接
tomcat jdbc pool 是 tomcat 的一個模塊,基于 tomcat JULI,,使用 Tomcat 的日志框架
使用 javax.sql.PooledConnection 接口獲取連接
支持高并發(fā)應(yīng)用環(huán)境
超簡單,,核心文件只有8個,比 c3p0 還少
更好的空閑連接處理機(jī)制
支持 JMX
支持 XA Connection,。
tomcat jdbc pool 可在 Tomcat 中直接使用,,也可以在獨(dú)立的應(yīng)用中使用。
1.Tomcat 中直接使用的方法:
在conf/server.xml下的<GlobalNamingResources>節(jié)點(diǎn)里配置resource,例如:
Xml代碼 - <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>節(jié)點(diǎn)中添加如下配置:
- <ResourceLink global="jdbc/ens" name="jdbc/ens" type="javax.sql.DataSource"/>
global="jdbc/ens" 中的參數(shù)值("jdbc/ens")必須和上一段<Resource >配置中的name屬性的值保持一樣,。name="jdbc/ens" 這個可以隨便取,但是在程序中調(diào)用的時候,就應(yīng)該與name的值保持一致。到這里,連接池已經(jīng)配置好啦,。
用JSP測試一下:
Html代碼 - <%@ 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("已經(jīng)獲得DataSource!");
- out.println("<br>");
- conn = ds.getConnection();
- try{
- stmt = conn.createStatement();
- String sql ="select * from ens_area";
- rs = stmt.executeQuery(sql);
- out.println("以下是從數(shù)據(jù)庫中讀取出來的數(shù)據(jù):<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();
- }
- }
-
- %>
分享到:
|