1. 程式人生 > >tomcat7.0下jndi的三種配置方式

tomcat7.0下jndi的三種配置方式

tomcat配置jndi

有全域性配置和區域性配置。大致的有以下幾種配置方式:

jndi(Java Naming and Directory Interface,Java命名和目錄介面)是一組在Java應用中訪問命名和目錄服務的API。命名服務將名稱和物件聯絡起來,使得我們可以用名稱

訪問物件。目錄服務是一種命名服務,在這種服務裡,物件不但有名稱,還有屬性。

         tomcat配置jndi有全域性配置和區域性配置。大致的有以下三種配置方式:

總結:
第一步:

將驅動程式(jar包)放到tomcat安裝目錄下的common\lib資料夾下

第二步:

第一種:區域性配置

在Tomcat的webapps目錄隨便建立一個工程目錄,例如test。在myjdbc目錄下建立META-INF目錄,在此目錄下建立一個context.xml檔案,裡面的內容如下:


<?xml version="1.0" encoding="UTF-8"?>
		<Context >  
		 <Resource name="jdbc/drp" 
			 auth="Container" 
			 type="javax.sql.DataSource" 
			 driverClassName="com.mysql.jdbc.Driver" 
			 url="jdbc:mysql://localhost:3306/drp" 
			 username="root" password="123456" 
			 maxActive="20" maxIdle="10" 
			 maxWait="10000"/>
		</Context>

附註如下:
Tomcat標準資料來源資源工廠配置項如下:
* driverClassName - 所使用的JDBC驅動類全稱。
* maxActive - 同一時刻可以自資料庫連線池中被分配的最大活動例項數。
* maxIdle - 同一時刻資料庫連線池中處於非活動狀態的最大連線數。
* maxWait - 當連線池中沒有可用連線時,連線池在丟擲異常前將等待的最大時間,單位毫秒。
* password - 傳給JDBC驅動的資料庫密碼。
* url - 傳給JDBC驅動的連線URL。
* user - 傳給JDBC驅動的資料庫使用者名稱。
* validationQuery - 一個SQL查詢語句,用於在連線被返回給應用前的連線池驗證。
* 如果指定了該屬性,則必為至少返回一行記錄的SQL SELECT語句。


jdbc/drp是資料來源的名稱(隨意寫,要和web.xml檔案中 <res-ref-name>jdbc/drp</res-ref-name> 一樣即可),
其他的引數按照自己的實際情況進行修改,例如資料庫的名稱、賬號、密碼。

第三步:

在myjdbc目錄下建立WEB-INF目錄,建立web.xml檔案,內容如下: 

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
version="2.4"> 

    <resource-ref> 
        <description>DB Connection</description> 
        <res-ref-name>jdbc/drp</res-ref-name> 
        <res-type>javax.sql.DataSource</res-type> 
        <res-auth>Container</res-auth> 
    </resource-ref> 
</web-app

說明:
<resource-ref>
<descrtiption>引用資源說明</descrtiption>
<res-ref-name>引用資源的JNDI名</res-ref-name>
<res-type>引用資源的類名</res-type>
<res-auth>管理者(Container)</res-auth><!--Container-容器管理 Application-Web應用管理-->
</resource-ref>
第四步:

寫個jsp,試一下吧!(不能再普通java類裡面測試,必須啟動容器在jsp中呼叫)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
  <%
  	Connection conn =null;
	  try
	  {
	   //初始化查詢名稱空間
	   Context ctx = new InitialContext(); 
	   //InitialContext ctx = new InitialContext();亦可 
	   //找到DataSource,對名稱進行定位java:comp/env是必須加的,後面跟你的DataSource名
	   DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/drp");
	   //取出連線
	    conn = ds.getConnection();
	   out.println(conn);
	   out.println(conn.isClosed());
	   out.println("</br>");
	   
		System.out.println("connection pool connected !!");   
	  } catch (NamingException e) {
	   System.out.println(e.getMessage());
	  } catch (SQLException e) {
	   e.printStackTrace();
	  }finally
	  {
	   //注意不是關閉,是放回連線池.
	   conn.close();
	  }
	
	
  
  %>
  
  
  
    This is my JSP page. <br>
  </body>
</html>


我成功了!
以下是配置JNDI的其他方法,個人不建議使用,因為修改伺服器的
server.xml和web.xml,如果有一點錯誤,你的容器就會崩潰~

注:連線資料來源的方法還有很多,在這裡我簡要說之:

比如說第二步還可以這麼做:

第二種 區域性配置 :在/tomcat/conf/Catalina/localhost(或其它主機名)/中新增以
虛擬目錄名稱(你的工程名)命名的XML檔案來配置context.
比如我的主機下有個目錄dbpool其地址為tomcat/webapps/test我可以這樣來配置這個上下文:
在tomcat/conf/Catalina/localhost/目錄下建立test.xml檔案,內容和上面一樣.

第三種 區域性配置:還可以:
在/tomcat/conf/server.xml中<host></host>標籤之間新增

 <Context path="/test" docBase="/test">  
		 <Resource name="jdbc/drp" 
			 auth="Container" 
			 type="javax.sql.DataSource" 
			 driverClassName="com.mysql.jdbc.Driver" 
			 url="jdbc:mysql://localhost:3306/drp" 
			 username="root" password="123456" 
			 maxActive="20" maxIdle="10" 
			 maxWait="10000"/>
		</Context> 
其中path是你的工程路徑(相對或絕對亦可),其中docBase="test"說明,此主機已經指向到webapps目錄下了,回頭
來看test這個上下文,它實際目錄是位於webapps的目錄下的,所以
在Context中我們可以將docBase直接設定為test了。如果它在webapps/dbpool/test下,則設定為dbpool/test就可以了。

附:JNDI——Java Naming and Directory Interface是一套提供naming和 directory功能的 API,
Java應用程式開發者透過使用 JNDI,在naming和 directory方面的應用上就有了共通的準則.

還有一種全域性配置是在

1)在tomcat的conf資料夾下的context.xml配置檔案中加入:

 <Resource name="jdbc/drp" 
			 auth="Container" 
			 type="javax.sql.DataSource" 
			 driverClassName="com.mysql.jdbc.Driver" 
			 url="jdbc:mysql://localhost:3306/drp" 
			 username="root" password="123456" 
			 maxActive="20" maxIdle="10" 
			 maxWait="10000"/>
其他不變
總結:如果要配置區域性的話,推薦使用第一種方式,這樣不依賴tomcat了。但是還是推薦使用最後一種方式好,雖然依賴tomat,但是是全域性的,而且可以配置
多個。對於以後切換使用方便。
在專案的web.xml中新增的資源引用可有可無。