【Tomcat】Tomcat 配置JNDI數據源(三)


數據源的由來

  在Java開發中,使用JDBC操作數據庫的四個步驟如下:

      ①加載數據庫驅動程序(Class.forName("數據庫驅動類");)
      ②連接數據庫(Connection con  = DriverManager.getConnection();)
      ③操作數據庫(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
      ④關閉數據庫,釋放連接(con.close();)
  也就是說,所有的用戶都需要經過此四步進行操作,但是這四步之中有三步(①加載數據庫驅動程序、②連接數據庫、④關閉數據庫,釋放連接)對所有人都是一樣的,而所有人只有在操作數據庫上是不一樣,那么這就造成了性能的損耗。
  那么最好的做法是,准備出一個空間,此空間里專門保存着全部的數據庫連接,以后用戶用數據庫操作的時候不用再重新加載驅動、連接數據庫之類的,而直接從此空間中取走連接,關閉的時候直接把連接放回到此空間之中。
  那么此空間就可以稱為連接池(保存所有的數據庫連接),但是如果要想實現此空間的話,則必須有一個問題要考慮?
      1、 如果沒有任何一個用戶使用連接,那么那么應該維持一定數量的連接,等待用戶使用。
      2、 如果連接已經滿了,則必須打開新的連接,供更多用戶使用。
      3、 如果一個服務器就只能有100個連接,那么如果有第101個人過來呢?應該等待其他用戶釋放連接
      4、 如果一個用戶等待時間太長了,則應該告訴用戶,操作是失敗的。
   如果直接用程序實現以上功能,則會比較麻煩,所以在Tomcat 4.1.27之后,在服務器上就直接增加了數據源的配置選項,直接在服務器上配置好數據源連接池即可。在J2EE服務器上保存着一個數據庫的多個連接。每一個連接通過DataSource可以找到。DataSource被綁定在了JNDI樹上(為每一個DataSource提供一個名字)客戶端通過名稱找到在JNDI樹上綁定的DataSource,再由DataSource找到一個連接。如下圖所示:
   
  那么在以后的操作中,除了數據庫的連接方式不一樣之外,其他的所有操作都一樣,只是關閉的時候不是徹底地關閉數據庫,而是把數據庫的連接放回到連接池中去。
  如果要想使用數據源的配置,則必須配置虛擬目錄,因為此配置是在虛擬目錄之上起作用的。需要注意的是,如果要想完成以上的功能,在Tomcat服務器上一定要有各個數據庫的驅動程序。

配置JDNI數據源

  1、將數據庫連接的驅動jar包放入,tocmat的lib目錄

  2、在tomcat服務器的conf目錄下context.xml配置文件中,配置數據源

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!--
 3   Licensed to the Apache Software Foundation (ASF) under one or more
 4   contributor license agreements.  See the NOTICE file distributed with
 5   this work for additional information regarding copyright ownership.
 6   The ASF licenses this file to You under the Apache License, Version 2.0
 7   (the "License"); you may not use this file except in compliance with
 8   the License.  You may obtain a copy of the License at
 9 
10       http://www.apache.org/licenses/LICENSE-2.0
11 
12   Unless required by applicable law or agreed to in writing, software
13   distributed under the License is distributed on an "AS IS" BASIS,
14   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   See the License for the specific language governing permissions and
16   limitations under the License.
17 -->
18 <!-- The contents of this file will be loaded for each web application -->
19 <Context>
20 
21     <!-- Default set of monitored resources. If one of these changes, the    -->
22     <!-- web application will be reloaded.                                   -->
23     <WatchedResource>WEB-INF/web.xml</WatchedResource>
24     <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
25 
26     <!-- Uncomment this to disable session persistence across Tomcat restarts -->
27     <!--
28     <Manager pathname="" />
29     -->
30     <!--
31       其中name  指定數據源在容器中的JNDI名
32       driverClassName 指定連接數據庫的驅動
33       url       指定數據庫服務的URL
34       username  指定連接數據庫的用戶名
35       password  指定連接數據庫的密碼
36       maxActive 最大連接數據庫連接數
37       maxIdle 最大等待連接中的數量
38       maxWait 最大等待毫秒數, 單位為 ms
39     -->
40     <Resource name="jdbc/datasource" 
41       auth="Container"
42       type="javax.sql.DataSource"
43       maxActive="100" 
44       maxIdle="30" 
45       maxWait="10000"
46       driverClassName="com.mysql.jdbc.Driver"
47       url="jdbc:mysql://127.0.0.1:3306/test?allowPublicKeyRetrieval=true" 
48       username="admin" 
49       password="admin"
50       characterEncoding="utf-8" />
51 </Context>

  3、在tomcat的conf/web.xml中引入數據源,或者在項目的web.xml中引入,在文件最后,引入方式如下:

1     <resource-ref>
2       <description>DB Connection</description>
3       <res-ref-name>jdbc/datasource</res-ref-name>
4       <ref-type>javax.sql.DataSource</ref-type>
5       <res-auth>Container</res-auth>
6     </resource-ref>

   4、測試,在webapps中,新建目錄test-jdbc,增加文件jdbc.jsp,如下:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="java.sql.*"%>
 4 <%@page import="javax.sql.DataSource"%>
 5 <%@page import="javax.naming.*"%>
 6 
 7 
 8 <!DOCTYPE html>
 9 <html>
10 <head>
11 <meta charset="UTF-8">
12 <title>Insert title here</title>
13 </head>
14 <body>
15 <h2>Tomcat JDBC</h2>
16     <%
17     // 初始化Context,使用InitialContext初始化Context
18     Context ctx=new InitialContext(); 
19     /*
20         通過JNDI查找數據源,該JNDI為java:comp/env/jdbc/dstest,分成兩個部分
21         java:comp/env是Tomcat固定的,Tomcat提供的JNDI綁定都必須加該前綴
22         jdbc/datasource 是定義數據源時的數據源名
23     */
24     DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/datasource");
25     // 獲取數據庫連接
26     Connection conn=ds.getConnection();
27     // 獲取Statement
28     Statement stmt=conn.createStatement();
29     // 執行查詢,返回ResulteSet對象
30     ResultSet rs=stmt.executeQuery("select * from user");
31     int count = rs.getMetaData().getColumnCount();
32     while(rs.next()) {//遍歷行,next()方法返回值為Boolean,當存在數據行返回true,反之false
33         for(int i = 1; i <= count; i++) {//遍歷列
34             out.print(rs.getString(i));
35             if(i < count) {
36                 out.print("\t-\t");//為數據隔開美觀,沒實際意義
37             }
38         }
39         out.println();
40     }  
41     %>
42 </body>
43 </html>

 

   5、啟動tomcat,並且在瀏覽器上訪問,地址:http://localhost:8080/test-jdbc/jdbc.jsp

    

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM