熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

詳細介紹在tomcat中配置數據源原理

2013-11-23 20:18:44  來源: Java開源技術 

  轉摘請注明出處

  作者:baggio

  來源:

  本文地址;

  關鍵詞DataSource(數據源)Tomcat連接池

  前言

  本文根據實例詳細介紹了如何在tomcat中配置數據源網上此類文章很多但是基本都是雷同的而且對一些特殊問題以及原理並未詳細闡述所以想根據自己的實際經驗並結合例子寫一篇詳細的文章

  本文是偶的一些拙見有不正確的地方請大家多多評論指正

  開發環境

  本文的環境JDKTOMCATOraclei

  JDBC簡介

  提到數據源那就不能不說JDBCJDBC是Java Database Connectivity的縮寫在javasql包中提供了JDBC API定義了訪問數據庫的接口和類但是JDBC API不能直接訪問數據庫必須依賴於數據庫廠商提供的JDBC驅動程序即JDBC DRIVER

  Javasql中常用的接口和類如下

  Driver接口和DriverManager類

  Connection

  Statement

  PreparedSataement

  ResultSet

       Driver接口和DriverManager類
       DriverManager類用來建立和數據庫的連接以及管理JDBC驅動程序常用方法如下

   方法 描述 registerDriver(Driver driver) 在DriverManager中注冊JDBC驅動程序 getConnection(String urlString userString pwd) 建立和數據庫的連接返回Connection對象 setLoginTimeOut(int seconds) 設定等待數據庫連接的最長時間 setLogWriter(PrintWriter out) 設定輸入數據庫日至的PrintWriter對象

       Connection
       Connection代表和數據庫的連接其常用方法如下

   方法 描述 getMetaData() 返回數據庫的MetaData數據MetaData數據包含了數據庫的相關信息例如當前數據庫連接的用戶名使用的JDBC驅動程序數據庫允許的最大連接數數據庫的版本等等 createStatement() 創建並返回Statement對象 PrepareStatement(String sql) 創建並返回prepareStatement對象

       Statement
       Statement用來執行靜態sql語句例如對於insertupdatedelete語句調用executeUpdate(String sql)方法而select語句可以調用executeQuery(String sql)方法executeQuery(String sql)方法返回ResultSet對象

       PrepareStatement
   PrepareStatement用於執行動態的sql語句即允許sql語句中包含參數使用方法為
   String sql = select col from tablename where col=? And col=?;
   PrepareStatement perpStmt = connpreparestatement(sql);
   perpStmtsetstring(colValue);
      perpStmtsetFloat(colValue);
      ResultSet rs = perpStmtexecuteQuery();

       ResultSet
 ResultSet用來表示select語句查詢得到的記錄集一個StateMent對象在同一時刻只能打開一個ResultSet對象通過ResultSet的getXXX()方法來得到字段值ResultSet提供了getString()getFloat()getInt()等方法可以通過字段的序號或者字段的名字來制定獲取某個字段的值例如在上例中getString()getString(col)都可以獲得字段col的值

  事務處理

  在實際應用中我們會遇到同時提交多個sql語句這些sql語句要麼全部成功要麼全部失敗如果其中一條提交失敗則必須撤銷整個事務為此Connection類提供了個控制事務的方法


   方法 描述 setAutoCommit(boolen autoCommit) 設置是否自動提交事務默認為自動提交 commit() 提交事務 rollback() 撤銷事務

  參考例子

try{


connSetautoCommit(false);


stmt = conncreatestatement();
stmtexecuteUpdate(delete form table where col=);
stmteecuteUpdate(delete from table where col=);


();


}catch(Exception e){


eprintStackTrace;


try{

connrollback();


} catch(Exception e){


eprintStackTrace;


}


}

  通過一個JSP例子來訪問oracle數據庫

<%@ page import=javautil*>


<%@ page import=javasql*>


<%


try{


Connection conn = null;


Statement stmt = null;


ResultSet rs = null;


//加載oracle驅動程序


ClassforName(oraclejdbcdriverOracleDriver);


//注冊oracle驅動程序


DriverManagerregidterDriver(new 
oraclejdbcdriverOracleDriver());


//建立數據庫連接


conn=DriverManagergetConnection(jdbc:oracle:thin:@your 
db ip:your db port:siddbuserdbpassword);


stmt = conncreateStatement();


rs = stmtexecuteQuery(select * from 
tablename);


while(rsnext){

outprint(rsgetstring(colname));


}


}catch(Exception e){


}


finally{


rsclose();


stmtclose();


connclose();


}

%>

  數據源簡介

  JDBC提供了javaxsqlDataSource的接口負責與數據庫建立連接實際應用時不需要編寫連接數據庫代碼直接從數據源獲得數據庫的連接Dataource中事先建立了多個數據庫連接這些數據庫連接保持在數據庫連接池中當程序訪問數據庫時只需要從連接池從取出空閒的連接訪問數據庫結束在將這些連接歸還給連接池DataSource對象由容器(Tomcat)提供不能使用創建實例的方法來生成DataSource對象要采用JAVA的JNDI(Java Nameing and Directory Interfacejava命名和目錄接口)來獲得DataSource對象的引用(另有一種說法其實從技術上來說數據源連接方式是不需要目錄服務的我們同樣可以通過序列化數據源對象直接訪問文件系統這點是需要明確的感興趣的朋友可以試試)JNDI是一種將對象和名字綁定的技術對象工廠負責生產出對象這些對象都和唯一的名字相綁定程序中可以通過這個名字來獲得對象的引用Tomcat把DataSource作為一種可配置的JNDI資源來處理生成DataSource對象的工廠為monsdbcpBasicDataSourceFactory

  配置數據源

  配置數據源其實相當簡單

  首先在serverxml中加入<Resource>元素打開serverxml在<Context>中加入以下代碼(以oracle為例)

   <Resource name=jdbc/ JNDI名字 auth=Container type=javaxsqlDataSource/>

<ResourceParams name=jdbc/JNDI名字>

<parameter>

<name>factory</name>
 
<value>monsdbcpBasicDataSourceFactory</value>

</parameter>

<parameter>

<name>maxActive</name>

<value></value>

</parameter>

<parameter>
 
<name>maxIdle</name>
 
<value></value>

</parameter>

<parameter>

<name>maxWait</name>
 
<value></value>

</parameter>

<parameter>
 
<name>username</name>

<value>用戶名</value>

</parameter>

<parameter>

<name>password</name>

<value>密碼</value>

</parameter>

<parameter>

<name>driverClassName</name>

<value>oraclejdbcdriverOracleDriver</value>

</parameter>

<parameter>

<name>url</name>
 
<value>jdbc:oracle:thin:@ip:端口:sid </value>

</parameter>

</ResourceParams>

  <Resource>元素的屬性如下

屬性 描述 name 指定Resource的JNDI的名字 auth 指定管理Resource的Manager由兩個可選值Container和ApplicationContainer表示由容器來創建和管理ResourceApplication表示由WEB應用來創建和管理Resource如果在web application deployment descriptor中使用<resourceref>這個屬性是必需的如果使用<resourceenvref>這個屬性是可選的 type 指定Resource所屬的java類名

  <ResourceParams>元素的屬性如下

   屬性 描述 name 指定ResourceParams的JNDI的名字必須和Resource的name保持一致 factory 指定生成DataSource對象的factory的類名 maxActive 指定數據庫連接池中處於活動狀態的數據庫連接最大數目表示不受限制 maxIdle 指定數據庫連接池中處於空閒狀態的數據庫連接的最大數目表示不受限制 maxWait 指定數據庫連接池中的數據庫連接處於空閒狀態的最長時間(單位為毫秒)超過這一事件將會拋出異常表示可以無限期等待 username 指定連接數據庫的用戶名 password 指定連接數據庫的密碼 driverClassName 指定連接數據庫的JDBC驅動程序 url 指定連接數據庫的URL

  其他文章說以上配置就OK了對於webxml的配置可有可無其實不是這樣子的如果在web應用中訪問了由Servlet容器管理的某個JNDI Resource則必須在webxml中聲明對這個JNDI Resource的引用表示資源引用的元素為<resourceref>該元素加在<wepapp></ wepapp >中


   <resourceref>

<descryiption>DB Connection</descryiption>

<resrefname>jdbc/JNDI名字 </resrefname>

<restype>javaxsqlDataSource </res type>

<resauth>Container </resauth>

</resourceref>

  <resourceref>元素的屬性如下

   屬性 描述 description 對所引用的資源的說明 resrefname 指定所引用資源的JNDI名字與<Resource>元素中的name屬性保持一致 restype 指定所引用資源的類名字與<Resource>元素中的type屬性保持一致 resauth 指定所引用資源的Manager與<Resource>元素中的auth屬性保持一致

  到這裡數據源就已經配置成功了但是我在測試的時候除了一點小麻煩主要原因是對DataSource的概念沒搞清楚我是這麼測試的寫一個測試類然後在eclipse中進行junit測試捕獲的異常為

  javaxnamingNoInitialContextException: Need to specify class name in environment or system property or as an applet parameter or in an application resource file: javanamingfactoryinitial

  同樣的代碼在JSP文件中正常運行後來翻了一些資料終於找到了問題的所在了原來DataSource是由容器(TOMCAT)提供的所以我的測試會拋出異常為了再次驗證想法是否正確在jsp文件中import剛才拋出異常的類在進行連接數據庫結果一切正常

  下面的例子是實際應用中使用DataSource在jsp文件中連接oracle

   <%@ page language=java import=javautil* pageEncoding=UTF%>

<%@ page import=javasql*%>

<%@ page import=javaxnaming*%>

<%@ page import=javaxsql*%>

<!DOCTYPE HTML PUBLIC //WC//DTD 
HTML Transitional//EN>

<html>

<head>

</head>

<body>

<%
Context initContext = new InitialContext();

Context envContext = (Context) initContextlookup(java:/comp/env);


DataSource db = (DataSource)envContextlookup(jdbc/javablogorl);


//javablogorl為<Resource>元素中name屬性的值

Connection conn = dbgetConnection( );

Statement stmt = conncreateStatement();


ResultSet rs = stmtexecuteQuery(SELECT * FROM blog_systemadmin);

while(rsnext()){

outprint(rsgetString(admin_name)+ );

outprint(rsgetString(admin_password)+<br>);

}

rsclose();

stmtclose();

connclose();
%>

</body>

</html>

  另:tomcat的配制方法為:

  <Resource name=jdbc/JNDI名字 auth=Container type=javaxsqlDataSource
               maxActive= maxIdle= maxWait=
               username=用戶名 password=密碼 driverClassName=oraclejdbcdriverOracleDriver
               url=jdbc:oracle:thin:@ip:端口:sid/>


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28263.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.