Tomcat中資料來源的配置和使用

來源:互聯網
上載者:User
Tomcat中資料來源的配置和使用 【轉載】 一、資料來源簡介:    在Java語言中,DataSource對象就是一個代表資料來源實體的對象。一個資料來源就是一個用來儲存資料的工具,它可以是複雜的大型企業級資料庫,也可以是簡單得只有行和列的檔案。資料來源可以位於在伺服器端,也可以位於客服端。    應用程式通過一個串連來訪問資料來源,那麼一個DataSource對象就是用於提供串連資料來源的工具。DataSource介面提供了兩個方法用於建立和資料來源的串連。    使用DataSource對象建立和資料庫的串連比起使用DriverManager介面更加高效,雖然兩者的使用範圍都很相似,並且都提供了方法用於建立和資料庫的串連,設定串連的最大逾時時間,擷取流、登入。  
  但兩者之間的區別更加明顯。和DriverManager不同,一個DataSource對象能夠識別和描述它所代表的資料來源的屬性,而且DataSource對象的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的關係,DataSource的建立、發布、獨立於應用程式的管理都依靠JNDI技術。   
  在JDBC2.0或JDBC3.0中,所有的資料庫驅動程式供應商必須提供一個實現了DataSource介面的類,要使用資料來源必須首先在JNDI中註冊該資料來源對象。    如果在JNDI中註冊了資料來源對象,將會比起使用DriverManager來具有兩個方面的優勢:    首先程式不需要像使用DriverManager一樣對載入的資料庫驅動程式資訊進行寫入程式碼,程式員可以選擇先在JNDI中註冊這個資料來源對象,然後在程式中使用一個邏輯名稱來引用它,JNDI會自動根據你給出的名稱找到與這個名稱綁定的DataSource對象。然後就可以使用這個DataSource對象來建立和具體資料庫的串連了。    其次,使用實現了DataSource介面的類所具有的第二個優勢體現在串連池和分散式交易上。串連池通過對串連的複用而不是建立一個物理串連來顯著地提高程式的效率。從而適用於任務繁忙、負擔繁重的企業級分散式交易。
   二、JNDI簡介:    JNDI是用於向Java程式提供目錄和命名功能的API。它被設計成獨立於特定的目錄服務,所以各種各樣的目錄都可以通過相同的方式進行訪問。   可以簡單地把JNDI理解為一種將對象和名字綁定的技術,對象工廠負責生產出對象,這些對象都和惟一的名字綁定。外部程式可以通過名字來擷取對某個對象的引用。   三、資料來源和串連池的關係:     JDBC2.0提供了javax.sql.DataSource介面,它負責建立與資料庫的串連,在應用程式訪問資料庫時不需要編寫串連資料庫的代碼,可以直接從資料來源獲得資料庫連接。 
  在DataSource中事先建立了多個資料庫連接,這些資料庫連接儲存在串連池(Connect Pool)中。Java程式訪問資料庫時,只需要從串連池中取出空閑狀態的資料庫連接;當程式訪問資料庫結束,再將資料庫連接放回串連池。
   四、資料來源和JNDI的關係:     DataSource對象是由Tomcat提供的,因此不能在程式中採用建立一個執行個體的方式來生產DataSource對象,而需要採用Java的另一個技術JNDI,來獲得DataSource對象的引用。    Tomcat把DataSource作為一種可以配置的JNDI資源來處理。產生DataSource對象的工廠為org.apache.commons.dbcp.BasicDataSourceFactory。    在javax.naming包中提供了Context介面,該介面提供了將對象和名字綁定,以及通過名字檢索對象的方法。Context中的主要方法有:    bind(String name,Object object):將對象與一個名字綁定
  lookup(String name):返回與指定的名字綁定的對象 

五、Tomcat中資料來源的配置:

資料來源的配置涉及修改server.xml和web.xml,在server.xml中加入定義資料來源的元素<Resource>,在web.xml加入<resource-ref>元素,聲明該Web應用所引用的資料。

  A.在server.xml中加入<Resource>元素:<Resource>元素用來定義JNDI Resource。  
  屬性    描述
  name    指定Resource的JNDI名字
  auth    指定管理Resource的Manager,它有兩個可選值:Container、Application
  type    指定Resource所屬的Java類名

<Resource name = "jdbc/BookDb"  auth = "Container"     type = "javax.sql.DataSource" />

      B.在<Resource>元素中加入<ResourceParams>元素:<ResourceParams>元素用來指定各種參數值
  
  屬性      描述
  factory    指定產生的DataResource的factory類名
  maxActive    指定資料庫連接池中處於活動狀態的最大串連數目,0表示不受限制
  maxIdle    指定資料庫連接池中處於空閑狀態的最大串連數目,0表示不受限制
  maxWait    指定串連池中串連處於空閑狀態的最長時間,超過會拋出異常,-1表示無限
  username    指定串連資料庫的使用者名稱
  password    指定串連資料庫的口令
  driverClassName    指定串連資料庫的JDBC驅動程式
  url  指定串連資料庫的URL

<ResourceParams name = "jdbc/BookDb"><parameter> <name>factory</name><value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter> <parameter> <name>maxActive</name> <value>100</value> </parameter> <parameter> <name>maxIdle</name> <value>30</value> </parameter> <parameter> <name>maxWait</name> <value>10000</value> </parameter> <parameter> <name>username</name> <value>user</value> </parameter> <parameter> <name>password</name> <value>1234</value> </parameter> <parameter> <name>driverClassName</name> <value>com.mysql.jdbc.Driver</value> </parameter> <parameter> <name>url</name><value>jdbc:mysql//localhost:3306/BookDb?autoReconnect=true</value> </parameter></ResourceParams> 註:以上為tomcat5.5版本以下的適用,若為tomcat5.5或以上版本則server.xml的格式為:

<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
               maxActive="20" maxIdle="5" maxWait="10000"
               username="user" password="password" driverClassName="oracle.jdbc.driver.OracleDriver" SetBigStringTryClob="true"
               url="jdbc:oracle:thin:@127.0.0.1:3444:test"/> 

C.在web.xml中加入<resource-ref>元素:<resource-ref>元素表示在Web應用中引用JNDI資源
  
  屬性      描述
  description    對所引用的資源的說明
  res-ref-name    指定所引用資源的JNDI名字,與<Resource>元素中的name屬性對應
  res-type  指定所引用資源的類名字,與<Resource>元素中的type屬性對應
  res-auth  指定所引用資源的Manager,與<Resource>元素中的auth屬性對應
  六、在Web應用中使用資料來源:

  javax.naming.Context提供了尋找JNDI Resource的介面,可以通過三個步驟來使用資料來源對象:

  A.獲得對資料來源的引用:

    Context ctx = new InitalContext();
DataSource ds =(DataSource)ctx.lookup("java:comp/env/jdbc/BookDb");

 B.獲得資料庫連接對象:

Connection con = ds.getConnection();

 C.返回資料庫連接到串連池:

     con.close();

      在串連池中使用close()方法和在非串連池中使用close()方法的區別是:前者僅僅是把資料庫連接對象返回到資料庫連接池中,是連線物件又恢複到空閑狀態,而非關閉資料庫連接,而後者將直接關閉和資料庫的串連。

  七、發布使用資料來源的Web應用:

  如果直接同JDBC訪問資料庫,可以把JDBC驅動程式拷貝到Web應用的WEB-INF/lib目錄或者Tomcat安裝目錄下的common/lib目錄下。
  
  如果通過資料來源訪問資料庫,由於資料來源由Servlet容器建立並維護,所以必須把JDBC驅動程式拷貝到Tomcat安裝目錄下的common/lib目錄下,確保Servlet容器能夠訪問驅動程式。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.