天天看點

jdbc連接配接池--DBCP-C3P0-Tomcat詳解一、JDBC複習二、JDBC的CURD操作三、資料庫連接配接池四、常用的資料庫連接配接池  

文章轉自:https://www.cnblogs.com/zhangyinhua/p/7765626.html

一、JDBC複習

  Java Data Base Connectivity,java資料庫連接配接,在需要存儲一些資料,或者拿到一些資料的時候,就需要往資料庫裡存取資料。那麼java如何連接配接資料庫呢?需要哪些步驟?

1.1、注冊驅動

  1)什麼是驅動

     驅動就是JDBC實作類,通俗點講,就是能夠連接配接到資料庫功能的東西就是驅動,由于市面上有很多資料庫,Oracle、MySql等等,是以java就有一個連接配接資料庫的實作規

    範接口,定義一系列的連接配接資料庫接口(java.sql.Driver接口),但是不提供實作,而每個資料庫廠家來提供這些接口的具體實作,這樣一來,不管使用的是什麼資料庫,我

    們開發者寫的代碼都是相同的,就不必因為資料庫的不同,而寫法不同,唯一的不同就是資料庫驅動不一樣,使用mysql,那麼就必須使用mysql的驅動,使用Oracle就必

    須使用oracle的驅動實作類。

    看下面mysql連接配接資料的原理圖,看看驅動是在哪裡,起什麼作用?

    

jdbc連接配接池--DBCP-C3P0-Tomcat詳解一、JDBC複習二、JDBC的CURD操作三、資料庫連接配接池四、常用的資料庫連接配接池  

  2)DriverManager,一個工具類,是用于操作管理JDBC實作類的

 原始寫法:DriverManager.register(new Driver());  //因為使用的是MySql,是以在導包時就需要導入com.mysql.jdbc.Driver

 現在寫法:Class.forName("com.mysql.jdbc.Driver");  //不用導包,會執行com.mysql.jdbc.Driver類中的靜态代碼塊,其靜态代碼塊的内容為
            static {
                try {                      
                 java.sql.DriverManager.registerDriver(new Driver());
                    } catch (SQLException E) {
                    throw new RuntimeException("Can't register driver!");
                             }
                        }  
           

  分析: 

   會發現第二種加載驅動的方法的底層其實就是第一種加載驅動。為什麼要這樣呢?原因很簡單, 第一種是硬程式設計,直接将資料庫驅動給寫死了,無法擴充,如果使用第一

   種,那麼連接配接的資料庫隻能是mysql,因為導包導的是mysql的驅動包,如果換成Oracle,就會報錯,需要在代碼中将Oracle的驅動包導入,這樣很麻煩,而第二種寫法就不

   一樣了,第二種是使用的字元串方法注冊驅動的,我們隻需要将該字元串提取到一個配置檔案中,以後想換成oracle資料庫,隻需要将該字元串換成oracle驅動的類全名即可

   ,而不需要到代碼中去修改什麼東西。

1.2、擷取連接配接

  使用DriverManage來獲得連接配接,因為DriverManager是驅動實作類的管理者

  Connection conn = DriverManager.getConnection(url,user,password);

    url:确定資料庫伺服器的位置,端口号,資料庫名

      jdbc:mysql://localhost:3306/db 

    user:登入名稱,預設root

    password:密碼,預設root   

  這裡隻是說mysql,别的資料庫,url格式就不同了。

    MySQL    jdbc:mysql://localhost:3306/db    預設端口是3306,粗體為連接配接時使用的資料庫名

    Oracle     jdbc:oracle:thin:@localhost:1521:db  預設端口号1521

    DB2      jdbc:db2://localhost:6789/db      預設端口号6789

    SQLServer  jdbc:microsoft:sqlserver://localhost:1433;databaseName=db  預設端口号1433

    SQLServer 2005  jdbc:sqlserver://localhost:1433;databaseName=db  預設端口号1433

1.3、擷取執行sql對象,PreparedStatement對象 

  通過Connection對象擷取Statement或者PraparedStament對象(使用它)處理sql

  1)Statement

    Statement st = conn.createStatement();  //擷取sql語句執行對象

    st.excuteUpdate(sql);  //執行增删改語句

    st.excuteQuery(sql);  //執行查詢語句      

    sql語句必須是完整的。

  2)PraparedStatment

    sql語句可以不是完整的,可以将參數用?替代,然後在預編譯後加入未知參數

    PraparedStatment ps = conn.prapareStatement(sql);  //擷取sql語句執行對象praparedStatment

    指派

      ps.setInt(Index,value);  ps.setString(index,value);  //可以設定很多中類型,index從1開始,代表sql語句中的第幾個未知參數,

      ps.excuteUpdate();  //執行增删改語句

      ps.excuteQuery(sql);  //執行查詢語句

  這兩個的差別,常使用的是PraparedStatment對象,因為它可以預編譯,效率高,可以設定參數等等優點。

1.4、擷取結果集對象

  int count = ps.excuteUpdate();   //執行增删改的sql語句時,傳回一個int類型的整數,代表資料庫表影響的行數,

  Result result = ps.excuteQuery();  //執行查詢sql語句時,傳回一個結果集對象,該對象裝着所有查詢到的資料資訊,一行一行的存儲資料庫表資訊。

1.5、處理結果集

  對查詢到的Result結果進行處理,拿到所有資料,并封裝成對象。

        while(rs.next()){

          擷取行資料的第一種方式
          rs.getString(index);//index代表第幾列,從1開始

          擷取行資料的第二中方式
          rs.getString(string);  //string:代表字段名稱。

        }
           

  

jdbc連接配接池--DBCP-C3P0-Tomcat詳解一、JDBC複習二、JDBC的CURD操作三、資料庫連接配接池四、常用的資料庫連接配接池  

  總結:java的JDBC就分為5步,4個屬性

    屬性:driver、url、user、password

    五步:

      注冊驅動、擷取連接配接、擷取執行sql語句對象、擷取結果集對象、處理結果。

二、JDBC的CURD操作

  建立(Create)、更新(Update)、讀取(Retrieve)和删除(Delete)操作

  查詢所有(讀取Retrieve)

2.1、查詢所有記錄讀取(Retrieve)

@Test
    public void findAll() throws Exception{
        //1 注冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        //2 獲得連接配接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
        //3語句執行者,sql語句
        Statement st = conn.praparedStatement("select * from t_user");
        //4 執行查詢語句
        ResultSet rs = st.executeQuery();
        //5處理資料
        // * 如果查詢多個使用,使用while循環進行所有資料擷取
        // * 技巧:如果查詢結果最多1條,使用  if(rs.next()) {  查詢到了 } else {  沒有資料 }
        while(rs.next()){
            int id = rs.getInt(1);
            String username = rs.getString(2);
            String password =rs.getString(3);
            System.out.print(id + ", ");
            System.out.print(username + ", ");
            System.out.println(password);
        }
        //6釋放資源
        rs.close();
        st.close();
        conn.close();
        
    }
           

2.2、增加操作(建立Create)  

@Test
    public void save() throws Exception{
        //1 注冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        //2 獲得連接配接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
        //3語句執行者
        Statement st = conn.praparedStatement("insert into t_user(username,password) values(?,?)");
                //3.1指派
                st.setString(1,"xiaoming");
                st.setString(2,"123");
        //4 執行DML語句
        int r = st.executeUpdate();
        
        //5處理資料
        System.out.println(r);
        
        //6釋放資源
        //rs.close();
        st.close();
        conn.close();
    }
           

2.3、更新操作 (Update)

@Test
    public void update() throws Exception{
        //1 注冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        //2 獲得連接配接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
        //3語句執行者
        Statement st = conn.praparedStatement("update t_user set username = ? where id = ? ");
                //3.1指派參數
                st.setString(1,"xiaoye");
                st.setInt(2,2);
        //4 執行DML語句
        int r = st.executeUpdate();
        
        //5處理資料
        System.out.println(r);
        
        //6釋放資源
        //rs.close();
        st.close();
        conn.close();
}
           

2.4、删除操作(delete)

@Test
    public void delete() throws Exception{
        //1 注冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        //2 獲得連接配接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
        //3語句執行者
        Statement st = conn.praparedStatement("delete from t_user where id = ?");
                //3.1指派參數
                st.setInt(1,2);
        //4 執行DML語句
        int r = st.executeUpdate();
        
        //5處理資料
        System.out.println(r);
        
        //6釋放資源
        //rs.close();
        st.close();
        conn.close();
}
           

  也可以用我前面寫的JDBC連接配接的工具類去連接配接!

三、資料庫連接配接池

  在上面,我們在進行CRUD時,一直重複性的寫一些代碼,比如最開始的注冊驅動,擷取連接配接代碼,一直重複寫,通過編寫一個擷取連接配接的工具類後,解決了這個問題,但是又

  會出現新的問題,每進行一次操作,就會擷取一個連接配接,用完之後,就銷毀,就這樣一直建立連接配接,銷毀連接配接,建立,銷毀,連接配接Connection 建立與銷毀 比較耗時的。是以應

  該要想辦法解決這個問題?

  解決方法:

    連接配接池就是為了解決這個問題而出現的一個方法,為了提高性能,開發連接配接池,連接配接池中一直保持有n個連接配接,供調用者使用,調用者用完返還給連接配接池,繼續給别的調用

    者使用,比如連接配接池中一開始就有10個連接配接,當有5個使用者拿走了5個連接配接後,池中還剩5個,當第6個使用者在去池中拿連接配接而前面5個連接配接還沒歸還時,連接配接池就會建立一個

    連接配接給第六個使用者,讓池中一直能夠儲存最少5個連接配接,而當這樣建立了很多連接配接後,使用者歸還連接配接回來時,會比原先連接配接池中的10個連接配接更多,連接配接池就會設定一個池中

    最大空閑的連接配接數,如果超過了這個數,就會将超過的連接配接給釋放掉,連接配接池就是這樣工作的。

3.1、連接配接池概述

  資料庫連接配接池負責配置設定、管理和釋放資料庫連接配接,它允許應用程式重複使用一個現有的資料庫連接配接,而不是再重建立立一個;釋放空閑時間超過最大空閑時間的資料庫連接配接來避

  免因為沒有釋放資料庫連接配接而引起的資料庫連接配接遺漏。這項技術能明顯提高對資料庫操作的性能。

3.2、比較應用程式直接擷取連接配接和使用連接配接池

  1)應用程式直接擷取連接配接

    

jdbc連接配接池--DBCP-C3P0-Tomcat詳解一、JDBC複習二、JDBC的CURD操作三、資料庫連接配接池四、常用的資料庫連接配接池  

    缺點:使用者每次請求都需要向資料庫獲得連結,而資料庫建立連接配接通常需要消耗相對較大的資源,建立時間也較長。

          假設網站一天10萬通路量,資料庫伺服器就需要建立10萬次連接配接,極大的浪費資料庫的資源,并且極易造成資料庫伺服器記憶體溢出、當機。

  2)使用連接配接池連接配接

    

jdbc連接配接池--DBCP-C3P0-Tomcat詳解一、JDBC複習二、JDBC的CURD操作三、資料庫連接配接池四、常用的資料庫連接配接池  

 

    目的:解決建立資料庫連接配接耗費資源和時間很多的問題,提高性能。

四、常用的資料庫連接配接池  

  現在很多WEB伺服器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的實作,即連接配接池的實作。通常我們把DataSource的實作,按其英文含義稱之為資料源,

  資料源中都包含了資料庫連接配接池的實作。

  也有一些開源組織提供了資料源的獨立實作:

    DBCP 資料庫連接配接池 

    C3P0 資料庫連接配接池

  實際應用時不需要編寫連接配接資料庫代碼,直接從資料源獲得資料庫的連接配接。程式員程式設計時也應盡量使用這些資料源的實作,以提升程式的資料庫通路性能。

  DBCP、C3P0、tomcat内置連接配接池(JNDI)是我們開發中會用到的。

4.1、DBCP連接配接池

  1)概述

    DBCP 是 Apache 軟體基金組織下的開源連接配接池實作,使用DBCP資料源,應用程式應在系統中增加如下兩個 jar 檔案:

      Commons-dbcp.jar:連接配接池的實作

      Commons-pool.jar:連接配接池實作的依賴庫

    Tomcat 的連接配接池正是采用該連接配接池來實作的。該資料庫連接配接池既可以與應用伺服器整合使用,也可由應用程式獨立使用。

  1)擷取連接配接的兩種方式

    兩種方式獲得連接配接,使用配置檔案,不使用配置檔案

    1.1)不使用配置檔案,自己手動設定參數

       第一:導包

      

jdbc連接配接池--DBCP-C3P0-Tomcat詳解一、JDBC複習二、JDBC的CURD操作三、資料庫連接配接池四、常用的資料庫連接配接池  

      第二:測試例子

package com.zyh.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;


public class TestDBCP {

    public static void main(String[] args) {
        Connection conn = TestDBCP.getConnection();
        try {
            String sql = "select id,name,price from book";
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                String id = rs.getString(1);
                String name = rs.getString(2);
                double price = rs.getDouble(3);
                System.out.println("id="+id+",name="+name+",price="+price);
                System.out.println("-------------------------");
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }
    
    public static Connection getConnection(){
        //建立核心類
                BasicDataSource bds = new BasicDataSource();
                //配置4個基本參數
                bds.setDriverClassName("com.mysql.jdbc.Driver");
                bds.setUrl("jdbc:mysql:///book");
                bds.setUsername("root");
                bds.setPassword("654321");
                
                //管理連接配接配置
                bds.setMaxActive(50); //最大活動數
                bds.setMaxIdle(20);  //最大空閑數
                bds.setMinIdle(5);  //最小空閑數
                bds.setInitialSize(10);  //初始化個數
                
                //擷取連接配接
                try {
                     Connection conn = bds.getConnection();
                     return conn;
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                    }
    }

}
           

    1.2)使用配置檔案,參數寫入配置檔案中即可,也就是通過配置檔案來配置驅動、使用者名、密碼、等資訊  

      第一:導包

      和上面的一樣的

      第二:導入配置檔案dbcpconfig.properties

#連接配接設定
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/book
username=root
password=654321

#<!-- 初始化連接配接 -->
initialSize=10

#最大連接配接數量
maxActive=50

#<!-- 最大空閑連接配接 -->
maxIdle=20

#<!-- 最小空閑連接配接 -->
minIdle=5

#<!-- 逾時等待時間以毫秒為機關 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驅動建立連接配接時附帶的連接配接屬性屬性的格式必須為這樣:[屬性名=property;] 
#注意:"user" 與 "password" 兩個屬性會被明确地傳遞,是以這裡不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由連接配接池所建立的連接配接的自動送出(auto-commit)狀态。
defaultAutoCommit=true

#driver default 指定由連接配接池所建立的連接配接的隻讀(read-only)狀态。
#如果沒有設定該值,則“setReadOnly”方法将不被調用。(某些驅動并不支援隻讀模式,如:Informix)
defaultReadOnly=

#driver default 指定由連接配接池所建立的連接配接的事務級别(TransactionIsolation)。
#可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
           

      第三:擷取連接配接,測試例子

package com.zyh.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class TestDBCPPro {

    public static void main(String[] args) {
        Connection conn = TestDBCPPro.getConnection();
        try {
            String sql = "select id,name,price from book";
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                String id = rs.getString(1);
                String name = rs.getString(2);
                double price = rs.getDouble(3);
                System.out.println("id="+id+",name="+name+",price="+price);
                System.out.println("-------------------------");
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection(){
         //通過類加載器擷取指定配置檔案的輸入流,TestDBCPPro是一個類名
        InputStream in = TestDBCPPro.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
        Properties properties = new Properties();
        try {
                properties.load(in);
                //加載配置檔案,獲得配置資訊
                DataSource ds = BasicDataSourceFactory.createDataSource(properties);
                Connection conn = ds.getConnection();
                return conn;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    

}
           

    1.3)編寫一個資料源工具類

package com.zyh.util;


import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.imageio.stream.FileImageInputStream;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPUtils {
    private static DataSource ds = null;
    static{
        Properties prop = new Properties();
        try {
            prop.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));//根據DBCPUtil的classes的路徑,加載配置檔案
            ds = BasicDataSourceFactory.createDataSource(prop);//得到一個資料源 
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化錯誤,請檢查配置檔案");
        }
    }
    
    public static Connection getConnection(){
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("伺服器忙。。。");
        }
    }
    
    public static void release(Connection conn,Statement stmt,ResultSet rs){
        //關閉資源
                if(rs!=null){
                    try {
                        rs.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    rs = null;
                }
                if(stmt!=null){
                    try {
                        stmt.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    stmt = null;
                }
                if(conn!=null){
                    try {
                        conn.close();//關閉
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    conn = null;
                }
    }
    
}
           

4.2、C3P0

  1)導包

  

jdbc連接配接池--DBCP-C3P0-Tomcat詳解一、JDBC複習二、JDBC的CURD操作三、資料庫連接配接池四、常用的資料庫連接配接池  

  2)從配置資訊中擷取  配置檔案必須為xml(c3p0-config.xml)

<c3p0-config>
    <!-- 預設配置,如果沒有指定則使用這個配置 -->
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/book</property>
        <property name="user">root</property>
        <property name="password">654321</property>
    
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
        <user-overrides user="test-user">
            <property name="maxPoolSize">10</property>
            <property name="minPoolSize">1</property>
            <property name="maxStatements">0</property>
        </user-overrides>
    </default-config> 
    <!-- 命名的配置 -->
    <named-config name="jxpx">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/myums</property>
        <property name="user">root</property>
        <property name="password">root</property>
    <!-- 如果池中資料連接配接不夠時一次增長多少個 -->
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">20</property>
        <property name="minPoolSize">10</property>
        <property name="maxPoolSize">40</property>
        <property name="maxStatements">0</property>
        <property name="maxStatementsPerConnection">5</property>
    </named-config>
</c3p0-config>
           

  

    從配置檔案中看,需要注意一個地方,一個是default-config,一個是name-config,兩者都差別在于建立核心類對象時,如果将name-config作為參數傳進去,

    那麼将會調用name-config下的配置資訊,否則将調用default-config下的配置資訊,

    兩種方式使用c3p0,加參數,使用named-config 的配置資訊,不加參數,自動加載配置資訊,加載的是default-config中的資訊。

//1 c3p0...jar 将自動加載配置檔案。規定:WEB-INF/classes (src)  c3p0-config.xml,也就是将配置檔案放在src下就會自動加載。
         //ComboPooledDataSource dataSource = new ComboPooledDataSource(); //自動從配置檔案 <default-config>
         ComboPooledDataSource dataSource = new ComboPooledDataSource(); //手動指定配置檔案 <named-config name="jxpx">
         Connection conn = dataSource.getConnection();
         System.out.println(conn);
           

  3)編寫一個資料源工具類

  這個工具類的xml是:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/book/property>
    <property name="user">root</property>
    <property name="password">654321</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>

  </default-config>

</c3p0-config>
           

  工具類

package com.zyh.util;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Util {
    //得到一個資料源
    private static DataSource dataSource = new ComboPooledDataSource();
    
    //從資料源中得到一個連接配接對象
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("伺服器錯誤");
        }
    }
    
    public static void release(Connection conn,Statement stmt,ResultSet rs){
        //關閉資源
                if(rs!=null){
                    try {
                        rs.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    rs = null;
                }
                if(stmt!=null){
                    try {
                        stmt.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    stmt = null;
                }
                if(conn!=null){
                    try {
                        conn.close();//關閉
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    conn = null;
                }
    }
    
}
           

4.3、用JavaWeb伺服器管理資料源:Tomcat

  開發JavaWeb應用,必須使用一個JavaWeb伺服器,JavaWeb伺服器都内置資料源。

  Tomcat:(DBCP)

  資料源隻需要配置伺服器即可。

  配置資料源的步驟:

    1)拷貝資料庫連接配接的jar到tomcatlib目錄下

    2)配置資料源XML檔案

      a)如果把配置資訊寫在tomcat下的conf目錄的context.xml中,那麼所有應用都能使用此資料源。

      b)如果是在目前應用的META-INF中建立context.xml, 編寫資料源,那麼隻有目前應用可以使用。

<Context>
  <Resource name="jdbc/datasource" auth="Container"
            type="javax.sql.DataSource" username="root" password="654321"
            driverClassName="com.mysql.jdbc.Driver" 
          url="jdbc:mysql://localhost:3306/book"
            maxActive="8" maxIdle="4"/>
</Context>
           

  在servlet中進行測試:

  Context initCtx = new InitialContext();
  Context envCtx = (Context) initCtx.lookup("java:comp/env");  //path
  dataSource = (DataSource)envCtx.lookup("jdbc/datasource");   //context.xml中resource的name
           

  注意:此種配置下,驅動jar檔案需放置在tomcat的lib下  

  擴充:

    JNDI技術介紹:

      1)JNDI(Java Naming and Directory Interface),Java命名和目錄接口,它對應于J2SE中的javax.naming包。

      2)這套API的主要作用在于:

        它可以把Java對象放在一個容器中(JNDI容器),并為容器中的java對象取一個名稱,以後程式想獲得Java對象,隻需通過名稱檢索即可。

      3)其核心API為Context,它代表JNDI容器,其lookup方法為檢索容器中對應名稱的對象。