0.引言
許多Web應用程序需要通過JDBC驅動程序訪問數據庫,以支持該應用程序所需的功能。Java EE平台規范要求Java EE應用程序服務器為此目的提供一個DataSource實現(即,用於JDBC連接的連接池)。Tomcat提供了完全相同的支持,因此使用此服務在Tomcat上開發的基於數據庫的應用程序將在任何Java EE服務器上保持不變。
有關JDBC的信息,請參考以下內容:
-
http://www.oracle.com/technetwork/java/javase/jdbc/index.html - 有關Java數據庫連接信息的主頁。
-
http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html - JDBC 2.1 API規范。
-
http://java.sun.com/products/jdbc/jdbc20.stdext.pdf - JDBC 2.0標准擴展API(包括
javax.sql.DataSource
API)。這個包現在被稱為“JDBC可選包”。 -
http://www.oracle.com/technetwork/java/javaee/overview/index.htm - Java EE平台規范(涵蓋所有Java EE平台必須提供給應用程序的JDBC工具)。
注 - Tomcat中的默認數據源支持基於Commons 項目中的DBCP連接池 。然而,也可以使用實現任何其他連接池,通過編寫自己的自定義資源工廠,描述 如下。javax.sql.DataSource
1.安裝JDBC驅動程序
使用JDBC數據源 JNDI資源工廠要求您為Tomcat內部類和Web應用程序提供適當的JDBC驅動程序。這很容易通過將驅動程序的JAR文件安裝到 WEB-INF/lib
目錄中來完成,這使得驅動程序既可用於資源工廠,也可用於您的應用程序。
2.聲明您的資源要求
接下來,修改Web應用程序部署描述符(/WEB-INF/web.xml
)以聲明JNDI名稱,您將在其中查找預配置的數據源。按照慣例,所有這樣的名字都應該解析為jdbc
子上下文(相對於作為java:comp/env
所有提供的資源工廠的根的標准命名上下文來說,典型的web.xml
入口可能是這樣的:
<!--官網配置內容--> <resource-ref> <description> Resource reference to a factory for java.sql.Connection instances that may be used for talking to a particular database that is configured in the <Context> configuration for the web application. </description> <res-ref-name> jdbc/EmployeeDB </res-ref-name> <res-type> javax.sql.DataSource </res-type> <res-auth> Container </res-auth> </resource-ref> <!--下面是我自己MySQL的配置內容--> <resource-ref> <description> 使用DataSource為jdbc/news創建新的數據源 </description> <res-ref-name> jdbc/news </res-ref-name> <res-type> javax.sql.DataSource </res-type> <res-auth> Container </res-auth> </resource-ref>
警告 - 請確保您遵守DTD為Web應用程序部署描述符所需的元素排序!有關詳細信息,請參閱 Servlet規范。
3.編寫你的應用程序使用這個資源
此資源引用的典型用法可能如下所示:
//獲取Context實例 Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env/jdbn/news"); //java:comp/env/名后加上你自己的命名
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); //這樣直接就可以獲得了數據庫連接了
Connection conn = ds.getConnection(); ... use this connection to access the database ... conn.close();
請注意,應用程序使用在Web應用程序部署描述符中聲明的相同的資源引用名稱。這與<Context>
Web應用程序的元素中配置的資源工廠相匹配, 如下所述。
4.配置Tomcat的資源工廠
要配置Tomcat的資源工廠,請將這樣的元素添加到<Context>
Web應用程序的 元素中。
<!--官網配置內容--> <Context ...> ... <Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource" username="dbusername" password="dbpassword" driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database" maxActive="8" maxIdle="4"/> ... </Context> <!--下面是我自己的MySQL配置內容--> <Resource name="jdbc/news" auth="Container" type="javax.sql.DataSource" username="root" password="1992121niu" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/news" maxActive="100" maxIdle="30" maxWaite="10000"/>
請注意,資源名稱(此處jdbc/EmployeeDB
)必須與Web應用程序部署描述符中指定的值相匹配。
此示例假定您正在使用HypersonicSQL(我使用的是MySQL數據庫)數據庫JDBC驅動程序。自定義driverClassName
和 driverName
參數以匹配您的實際數據庫的JDBC驅動程序和連接URL。
Tomcat標准數據源資源工廠(org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
)的配置屬性如下所示:
-
driverClassName - 要使用的JDBC驅動程序的完全限定Java類名稱。
-
username - 要傳遞給我們的JDBC驅動程序的數據庫用戶名。
-
password - 數據庫密碼被傳遞給我們的JDBC驅動程序。
-
url - 要傳遞給我們的JDBC驅動程序的連接URL。(為了向后兼容,該屬性
driverName
也被認可。) -
initialSize - 池初始化期間將在池中創建的初始連接數。默認值:0
-
maxActive - 可同時從該池中分配的最大連接數。默認:8
-
minIdle - 同時在此池中閑置的最少連接數。默認值:0
-
maxIdle - 可同時在此池中閑置的最大連接數。默認:8
-
maxWait - 池在拋出異常之前等待的最大毫秒數(當沒有可用的連接時)。默認值:-1(無限)
一些額外的屬性處理連接驗證:
-
validationQuery - SQL查詢,可以在池返回到應用程序之前用於驗證連接。如果指定,這個查詢必須是一個返回至少一行的SQL SELECT語句。
-
validationQueryTimeout - 驗證查詢返回的超時秒數。默認值:-1(無限)
-
testOnBorrow - true或false:每次從池中借用驗證查詢是否驗證連接。默認值:true
-
testOnReturn - true或false:是否每次將連接返回到池時使用驗證查詢驗證連接。默認:false
可選的evictor線程負責通過移除任何長時間處於空閑狀態的連接來縮小池。退伍軍人不尊重minIdle
。請注意,如果您只希望池根據配置的maxIdle
屬性收縮,則不需要激活evictor線程。
evictor在默認情況下是禁用的,可以使用以下屬性進行配置:
-
timeBetweenEvictionRunsMillis - 逐出器連續運行之間的毫秒數。默認值:-1(禁用)
-
numTestsPerEvictionRun - 在逐出器的每次運行期間將由檢出器檢查空閑的連接數。默認:3
-
minEvictableIdleTimeMillis - 以秒為單位的空閑時間,在該時間之后,可以通過逐出器從池中刪除連接。默認值:30 * 60 * 1000(30分鍾)
-
testWhileIdle - true或者false:連接是否應該由evictor線程在池中閑置時使用驗證查詢進行驗證。默認:false
另一個可選功能是刪除廢棄的連接。如果應用程序長時間未將其返回到池,則稱該連接被放棄。游泳池可以自動關閉此類連接並將其從游泳池中移除。這是泄露連接的應用程序的解決方法。
放棄功能默認是禁用的,可以使用以下屬性進行配置:
-
removeAbandoned - true或false:是否從池中刪除放棄的連接。默認:false
-
removeAbandonedTimeout - 假定借用連接被放棄的秒數。默認值:300
-
logAbandoned - true或false:是否為放棄語句或連接的應用程序代碼記錄堆棧跟蹤。這增加了嚴重的開銷。默認:false
最后有各種屬性可以進一步調整池的行為:
-
defaultAutoCommit - true或false:由此池創建的連接的默認自動提交狀態。默認值:true
-
defaultReadOnly - true或false:由此池創建的連接的默認只讀狀態。默認:false
-
defaultTransactionIsolation - 這設置默認事務隔離級別。可以是一個
NONE
,READ_COMMITTED
,READ_UNCOMMITTED
,REPEATABLE_READ
,SERIALIZABLE
。默認:沒有默認設置 -
poolPreparedStatements - true或false:是否要池PreparedStatements和CallableStatements。默認:false
-
maxOpenPreparedStatements - 可以從語句池同時分配的最大打開語句數。默認值:-1(無限制)
-
defaultCatalog - 默認目錄的名稱。默認:未設置
-
connectionInitSqls - 在創建連接后運行一次SQL語句。用分號(
;
)分隔多個語句。默認:沒有語句 -
connectionProperties - 傳遞給驅動程序以創建連接的驅動程序特定屬性的列表。每個屬性都給定為
name=value
,多個屬性用分號(;
)分隔。默認值:沒有屬性 -
accessToUnderlyingConnectionAllowed - true或false:是否允許訪問基礎連接。默認:false
*Myeclipes下使用
在myeclipes下使用可以不用配置web.xml直接將context.xml放入WebRoot的META-INF文件即可
如圖: