Tomcat 數據源的原理、配置、使用


1、數據源的作用及操作原理

  在程序代碼中使用數據源是可以提升操作性能的,這種性能的提升依靠於運行的原理。 

  傳統JDBC操作步驟
    1、加載數據庫驅動程序,數據庫驅動程序通過CLASSPATH配置;
    2、通過DriverManager類取得數據庫連接對象;
    3、通過Connection實例化PreparedStatement對象,編寫SQL命令操作數據庫
    4、數據庫屬於資源操作,操作完成后進行數據庫的關閉以釋放資源。如圖所示:

    對於不同的用戶只有操作不同,但是對於1、2、4三個步驟很明顯是一個重復的操作。

    如果開發中直接使用JDBC操作的話,那么就會產生這種性能的問題,那么怎么做最合適呢?

    如果假設數據庫不關閉,以后如果有新的用戶使用的時候直接取一個已經有的連接的話。

    就好比,學校為學生提供雨傘,一旦下雨將為學生准備雨傘,這個時候學生不用再重新去找雨傘,之后再重新去買雨傘。

    假設有100把傘,如果現在不下雨,肯定不能把所有的傘都擺上,所以一般平常如果沒人用的時候至少擺上10把。當然,最大的時候只能提供100把傘。

    還需要一個等待的時間。

    最小維持的數據庫連接數,最大允許打開的連接數。

    Tomcat 4.1 版本之后就開始支持這種操作了,這種操作就稱為數據庫連接池,存放的是所有的數據庫連接。

2、在Tomcat中使用數據庫連接池

   在web容器中,數據庫的連接池都是通過數據源(javax.sql.DataSource)訪問的,即:可以通過 javax.sql.DataSource 類取得Connection對象,但是如果要想得到一個DataSource對象需要使用JNDI進行查找。

    JNDI(Java Naming and Directory Interface)屬於命名及目錄查找接口,主要的功能是用於進行查找的,查找對象。
但是,現在的數據庫的連接池是需要在Tomcat上完成配置的。

    要修改server.xml文件才可以起作用。

    如下,以連接mysql為例:

 1 <Context docBase="D:/data/webdemo" path="/webdemo" debug="0"  reloadable="true">
 2       <Resource name="jdbc/mydb"
 3                 auth="Container"
 4                 type="javax.sql.DataSource"
 5                 maxActive="100"
 6                 maxIdle="30"
 7                 maxWait="10000"
 8                 username="root"
 9                 password="root"
10                 driverClassName="org.gjt.mm.mysql.Driver"
11                 url="jdbc:mysql://localhost:3306/mydb"/>
12 </Context>

    此配置有幾個參數:
      ·name:表示數據源名稱,也是JNDI要查找的名稱
      ·auth:表示由誰負責資源連接,Container:容器管理,application:程序管理,一般設置為 Container
      ·type:表示對象,數據源上每一個綁定的都是DataSource
      ·maxActive:表示最大激活連接數,這里取值為100,表示同時最多有100個數據庫連接,一般把maxActive設置成可能的並發量
      ·maxIdle:表示最大的空閑連接數,這里取值為30,表示即使沒有數據庫連接時依然可以保持30空閑的連接,而不被清除,隨時處於待命狀態
      ·maxWait:表示最大等待秒鍾數,這里取值10000,表示10秒后超時,如果取值-1,則表示無限等待,直到超時為止,如果超時將接到異常
      ·username:數據庫用戶名
      ·password:數據庫登錄密碼
      ·driverClassName:數據庫驅動名
      .url:數據庫url

    但是現在使用的Tomcat版本是6.0以上的版本,所以想讓一個數據源起作用的話,還必須在web.xml(注意:此web.xml是web項目的web.xml文件,而不是tomcat服務器的web.xml文件)文件之中完成配置。

1   <resource-ref>
2     <res-ref-name>jdbc/mydb</res-ref-name>
3     <res-type>javax.sql.DataSource</res-type>
4     <res-auth>Container</res-auth>
5   </resource-ref>

3、查找數據源

    數據源的操作使用的是JNDI方式進行查找的,所以如果要想使用數據源取得數據庫連接的話,則必須按照如下的步驟進行
      初始化名稱查找上下文:Context ctx = new InitialContext();
      通過名稱查找DataSource對象:DataSource ds = (DataSource)ctx.lookup(JNDI名稱);
      通過DataSource取得一個數據庫連接:Connection conn = ds.getConnection()。

    此時調用數據庫會出現一個Exception:
    javax.servlet.ServletException: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
    實際上對於這種資源操作,本身是需要一個環境屬性的支持的: java:comp/env,但是Tomcat服務器本身是免費的,沒有對這種屬性提供支持,如果要想訪問Tomcat中的名稱服務的話,則肯定要在前面加上此屬性,即,現在的名稱是: java:comp/env/jdbc/mydb;即用Tomcat的話JNDI名稱就是:java:comp/env/JNDI名稱 。

    以后程序中只認名字,而具體是哪個數據庫將由配置決定。
    當然,如果現在使用的是DAO開發的,DatabaseConnection.java類。

 1 package com.shawn.mvcdemo.dbc;
 2 
 3 import java.sql.*;
 4 import javax.sql.*;
 5 import javax.naming.*;
 6 
 7 public class DatabaseConnection{
 8     private static final String DSNAME = "java:comp/env/jdbc/mldn";//java:comp/JNDI名稱
 9 
10     private Connection conn = null;
11 
12     public DatabaseConnection() throws Exception{
13         Context ctx = new InitialContext();        //初始化名稱查找上下文
14         DataSource ds = (DataSource)ctx.lookup(DSNAME); //通過名稱查找DataSource對象
15         this.conn = ds.getConnection();          //通過DataSource取得一個數據庫連接
16     }
17 
18     public Connection getConnection(){
19         return this.conn;
20     }
21 
22     public void close() throws Exception{
23         if(this.conn != null){
24             try{
25                 this.conn.close();            //釋放數據庫連接
26             } catch(Exception e){
27                 throw e;
28             }
29         }
30     }
31 
32     public static void main(String args[]){
33         try{
34             System.out.println(new DatabaseConnection().getConnection());
35         } catch(Exception e){
36             e.printStackTrace();
37         }
38     }
39 }

  可是有一點也必須注意的是,現在的數據庫連接池實在Tomcat上配置的,所以此程序只能在web下運行,而不能使用application程序運行。

總結:

  要使用數據庫連接池

  1、配置server.xml;

  2、配置web項目中的(比如:webdemo項目)web.xml文件,添加 resource-ref 配置;

  3、修改程序中獲取Connection的方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM