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為例:
<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>
此配置有幾個參數:
·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文件)文件之中完成配置。
<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、查找數據源
數據源的操作使用的是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類。
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取得一個數據庫連接 } public Connection getConnection(){ return this.conn; } public void close() throws Exception{ if(this.conn != null){ try{ this.conn.close();//釋放數據庫連接 } catch(Exception e){ throw e; } } } public static void main(String args[]){ try{ System.out.println(new DatabaseConnection().getConnection()); } catch(Exception e){ e.printStackTrace(); } }}
可是有一點也必須注意的是,現在的數據庫連接池實在Tomcat上配置的,所以此程序只能在web下運行,而不能使用application程序運行。
總結:
要使用數據庫連接池
1、配置server.xml;
2、配置web項目中的(比如:webdemo項目)web.xml文件,添加 resource-ref 配置;
3、修改程序中獲取Connection的方式。
以上這篇基于Tomcat 數據源的原理、配置、使用介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答
圖片精選