基于Tomcat 數(shù)據(jù)源的原理、配置、使用介紹
1、數(shù)據(jù)源的作用及操作原理
在程序代碼中使用數(shù)據(jù)源是可以提升操作性能的,這種性能的提升依靠于運(yùn)行的原理。
傳統(tǒng)JDBC操作步驟
1、加載數(shù)據(jù)庫驅(qū)動(dòng)程序,數(shù)據(jù)庫驅(qū)動(dòng)程序通過CLASSPATH配置;
2、通過DriverManager類取得數(shù)據(jù)庫連接對象;
3、通過Connection實(shí)例化PreparedStatement對象,編寫SQL命令操作數(shù)據(jù)庫;
4、數(shù)據(jù)庫屬于資源操作,操作完成后進(jìn)行數(shù)據(jù)庫的關(guān)閉以釋放資源。如圖所示:

對于不同的用戶只有操作不同,但是對于1、2、4三個(gè)步驟很明顯是一個(gè)重復(fù)的操作。
如果開發(fā)中直接使用JDBC操作的話,那么就會(huì)產(chǎn)生這種性能的問題,那么怎么做最合適呢?
如果假設(shè)數(shù)據(jù)庫不關(guān)閉,以后如果有新的用戶使用的時(shí)候直接取一個(gè)已經(jīng)有的連接的話。
就好比,學(xué)校為學(xué)生提供雨傘,一旦下雨將為學(xué)生準(zhǔn)備雨傘,這個(gè)時(shí)候?qū)W生不用再重新去找雨傘,之后再重新去買雨傘。
假設(shè)有100把傘,如果現(xiàn)在不下雨,肯定不能把所有的傘都擺上,所以一般平常如果沒人用的時(shí)候至少擺上10把。當(dāng)然,最大的時(shí)候只能提供100把傘。
還需要一個(gè)等待的時(shí)間。
最小維持的數(shù)據(jù)庫連接數(shù),最大允許打開的連接數(shù)。
Tomcat 4.1 版本之后就開始支持這種操作了,這種操作就稱為數(shù)據(jù)庫連接池,存放的是所有的數(shù)據(jù)庫連接。
2、在Tomcat中使用數(shù)據(jù)庫連接池
在web容器中,數(shù)據(jù)庫的連接池都是通過數(shù)據(jù)源(javax.sql.DataSource)訪問的,即:可以通過 javax.sql.DataSource 類取得Connection對象,但是如果要想得到一個(gè)DataSource對象需要使用JNDI進(jìn)行查找。

JNDI(Java Naming and Directory Interface)屬于命名及目錄查找接口,主要的功能是用于進(jìn)行查找的,查找對象。
但是,現(xiàn)在的數(shù)據(jù)庫的連接池是需要在Tomcat上完成配置的。
要修改server.xml文件才可以起作用。
如下,以連接mysql為例:
<Context docBase="D:/data/webdemo" path="/webdemo" debug="0" reloadable="true">
<Resource name="jdbc/mydb"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="root"
driverClassName="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://localhost:3306/mydb"/>
</Context>
此配置有幾個(gè)參數(shù):
·name:表示數(shù)據(jù)源名稱,也是JNDI要查找的名稱
·auth:表示由誰負(fù)責(zé)資源連接,Container:容器管理,application:程序管理,一般設(shè)置為 Container
·type:表示對象,數(shù)據(jù)源上每一個(gè)綁定的都是DataSource
·maxActive:表示最大激活連接數(shù),這里取值為100,表示同時(shí)最多有100個(gè)數(shù)據(jù)庫連接,一般把maxActive設(shè)置成可能的并發(fā)量
·maxIdle:表示最大的空閑連接數(shù),這里取值為30,表示即使沒有數(shù)據(jù)庫連接時(shí)依然可以保持30空閑的連接,而不被清除,隨時(shí)處于待命狀態(tài)
·maxWait:表示最大等待秒鐘數(shù),這里取值10000,表示10秒后超時(shí),如果取值-1,則表示無限等待,直到超時(shí)為止,如果超時(shí)將接到異常
·username:數(shù)據(jù)庫用戶名
·password:數(shù)據(jù)庫登錄密碼
·driverClassName:數(shù)據(jù)庫驅(qū)動(dòng)名稱
.url:數(shù)據(jù)庫url
但是現(xiàn)在使用的Tomcat版本是6.0以上的版本,所以想讓一個(gè)數(shù)據(jù)源起作用的話,還必須在web.xml(注意:此web.xml是web項(xiàng)目的web.xml文件,而不是tomcat服務(wù)器的web.xml文件)文件之中完成配置。
<resource-ref> <res-ref-name>jdbc/mydb</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
3、查找數(shù)據(jù)源
數(shù)據(jù)源的操作使用的是JNDI方式進(jìn)行查找的,所以如果要想使用數(shù)據(jù)源取得數(shù)據(jù)庫連接的話,則必須按照如下的步驟進(jìn)行
初始化名稱查找上下文:Context ctx = new InitialContext();
通過名稱查找DataSource對象:DataSource ds = (DataSource)ctx.lookup(JNDI名稱);
通過DataSource取得一個(gè)數(shù)據(jù)庫連接:Connection conn = ds.getConnection()。
此時(shí)調(diào)用數(shù)據(jù)庫會(huì)出現(xiàn)一個(gè)Exception:
javax.servlet.ServletException: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
實(shí)際上對于這種資源操作,本身是需要一個(gè)環(huán)境屬性的支持的: java:comp/env,但是Tomcat服務(wù)器本身是免費(fèi)的,沒有對這種屬性提供支持,如果要想訪問Tomcat中的名稱服務(wù)的話,則肯定要在前面加上此屬性,即,現(xiàn)在的名稱是: java:comp/env/jdbc/mydb;即用Tomcat的話JNDI名稱就是:java:comp/env/JNDI名稱 。
以后程序中只認(rèn)名字,而具體是哪個(gè)數(shù)據(jù)庫將由配置決定。
當(dāng)然,如果現(xiàn)在使用的是DAO開發(fā)的,DatabaseConnection.java類。
package com.shawn.mvcdemo.dbc;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class DatabaseConnection{
private static final String DSNAME = "java:comp/env/jdbc/mldn";//java:comp/JNDI名稱
private Connection conn = null;
public DatabaseConnection() throws Exception{
Context ctx = new InitialContext();//初始化名稱查找上下文
DataSource ds = (DataSource)ctx.lookup(DSNAME); //通過名稱查找DataSource對象
this.conn = ds.getConnection(); //通過DataSource取得一個(gè)數(shù)據(jù)庫連接
}
public Connection getConnection(){
return this.conn;
}
public void close() throws Exception{
if(this.conn != null){
try{
this.conn.close();//釋放數(shù)據(jù)庫連接
} catch(Exception e){
throw e;
}
}
}
public static void main(String args[]){
try{
System.out.println(new DatabaseConnection().getConnection());
} catch(Exception e){
e.printStackTrace();
}
}
}
可是有一點(diǎn)也必須注意的是,現(xiàn)在的數(shù)據(jù)庫連接池實(shí)在Tomcat上配置的,所以此程序只能在web下運(yùn)行,而不能使用application程序運(yùn)行。
總結(jié):
要使用數(shù)據(jù)庫連接池
1、配置server.xml;
2、配置web項(xiàng)目中的(比如:webdemo項(xiàng)目)web.xml文件,添加 resource-ref 配置;
3、修改程序中獲取Connection的方式。
以上這篇基于Tomcat 數(shù)據(jù)源的原理、配置、使用介紹就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
eclipse配置Tomcat找不到server選項(xiàng)的解決辦法
這篇文章通過圖文并茂的形式給大家介紹eclipse配置Tomcat找不到server選項(xiàng)的解決辦法,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
Tomcat宕機(jī)自動(dòng)重啟和每日定時(shí)啟動(dòng)的實(shí)現(xiàn)方法
在Web應(yīng)用開發(fā)中,Tomcat作為一款輕量級的Web服務(wù)器,被廣泛應(yīng)用于Java Web應(yīng)用的部署,然而,在實(shí)際運(yùn)行過程中,Tomcat可能會(huì)因?yàn)楦鞣N原因而意外宕機(jī),實(shí)現(xiàn)Tomcat的宕機(jī)自動(dòng)重啟和每日定時(shí)啟動(dòng)是非常必要的,本文將介紹如何通過簡單的腳本配置來實(shí)現(xiàn)這一目標(biāo)2025-02-02
tomcat簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了tomcat簡介,詳細(xì)的介紹了tomcat和Tomcat基本配置,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07
解決應(yīng)用啟動(dòng)失敗但tomcat不報(bào)錯(cuò)的方法
這篇文章主要給大家介紹了關(guān)于解決應(yīng)用啟動(dòng)失敗但tomcat不報(bào)錯(cuò)的方法,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06
Tomcat之web應(yīng)用的目錄組成結(jié)構(gòu)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Tomcat之web應(yīng)用的目錄組成結(jié)構(gòu),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
Tomcat無法映射到activiti-app導(dǎo)致activiti無法啟動(dòng)頁面的解決方法
這篇文章主要介紹了Tomcat無法映射到activiti-app導(dǎo)致activiti無法啟動(dòng)頁面的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
Tomcat 中如何給 web 項(xiàng)目配置虛擬目錄的方法
本篇文章主要介紹了Tomcat 中如何給 web 項(xiàng)目配置虛擬目錄的方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
詳解如何通過tomcat的ManagerServlet遠(yuǎn)程部署項(xiàng)目
這篇文章主要介紹了詳解如何通過tomcat的ManagerServlet遠(yuǎn)程部署項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08

