【J2EE系列】JNDI與tomcat鏈接池

    JNDI與tomcat鏈接池html

本章內容java

² JNDI與JNDI服務器程序員

² 編碼實現JNDI目錄服務與命名服務web

² 使用Tomcate JNDI服務器sql

1、JNDI概述數據庫

一、什麼是JNDI?apache

英文全稱是:Java Naming and Directory Interfacetomcat

命名服務提供了一種爲對象命名的機制,這樣你就能夠在無需知道對象位置的狀況下獲取和使用對象。只要該對象在命名服務器上註冊過,且你必須知道命名服務器的地址和該對象在命名服務器上註冊的JNDI名。就能夠找到該對象,得到其引用,從而運用它提供的服務。服務器

       利用JNDI能夠尋找在命名服務器上註冊過的全部對象。app

JNDI就是爲JAVA中命名和目錄服務定義的JAVA API,是命名服務的抽象機制。咱們能夠直接經過JNDI來操做命名服務,而不要與底層的命名服務器交互,大大減輕了程序員的壓力。

 二、什麼是JNDI server?

      能提供目錄或命名服務的服務器,至關於數據庫。

      常見JNDI服務器:DNS、XNam 、Novell目錄服務、

      LDAP(Lightweight Directory Access Protocol 輕型目錄訪問協議)、 

      CORBA對象服務、

      Tomcat數據源

      EJB容器的Bean對象(經過jdni技術訪問)

      文件系統、

      Windows XP/2000/NT/Me/9x的註冊表、

      RMI、DSML v1&v二、NIS 

三、爲何要使用JNDI?

解決多個應用程序訪問同一個資源的問題。

2、經過編碼瞭解JNDI,完成對文件系統的操做

JNDI包:

javax.naming:命名操做;

javax.naming.directory:目錄操做; 

JNDI經常使用類:

javax.naming.Context;(接口)

javax.naming.NamingEnumeration;(枚舉類)

javax.naming.InitialContext;(Context實現類)

一、建立一個目錄服務器

須要的包:

fscontext.jar;

providerutil.jar

commons-logging.jar

naming-resources.jar

naming-factory-dbcp.jar

         編寫JndiFile類,顯示結果爲此路徑下全部的資源名與類型。

     關鍵代碼:

public static void main(String[] arg)throws Exception{

    Hashtable ev=new Hashtable();

    //指定提供命名服務的類名 ev.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");

    //指定提供命名服務的服務器位置信息(遠程命名服務器要提供IP和端口號)

    ev.put(Context.PROVIDER_URL,"file:///d:/");

    //初始化命名目錄的上下文

    Context ctx=new InitialContext(ev);

    //列舉命名服務器根目錄下的全部對象

    NamingEnumeration  list=ctx.list("/");

    //顯示全部對象的信息

    while(list.hasMore()){

    //NameClassPair表示存在於上下文中的某一綁定的對象名稱和類名稱對

    NameClassPair nc = (NameClassPair) list.next();

System.out.println(nc);

    }

}

二、經過JNDI從目錄服務器中取出一個文件

從Jndi Context中查找一個文件使用的方法:

 lookUp(String name)

      lookUp(javax.name.Name )

兩個方法用來在Context中查找資源。

關鍵代碼以下

public static void main(String[] arg)throws Exception{

    Hashtable ev=new Hashtable();

    //指定提供命名服務的類名     ev.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");

    //指定提供命名服務的服務器位置信息(遠程命名服務器要提供IP和端口號)

    ev.put(Context.PROVIDER_URL,"file:///d:/");

    //初始化命名目錄的上下文

    Context ctx=new InitialContext(ev);

    //列舉命名服務器根目錄下的全部對象

    File file = (File)ctx.lookup("/wms/readme.txt");

    //緩衝字符流讀取對象

    BufferedReader br = new BufferedReader(new FileReader(file));

    //讀取文件信息

    String line = br.readLine();

    while(line != null){

       System.out.println(line);

       line = bw.readLine();

      }

}

三、編碼實現Java命名服務器

利用bind()和unBind()方法綁訂和撤消綁訂對象。

代碼:

public static void main(String[] arg) throws Exception {

Hashtable ev = new Hashtable();

//指定提供命名服務的類名

ev.put(Context.INITIAL_CONTEXT_FACTORY,

"org.apache.naming.java.javaURLContextFactory");

//初始化命名目錄的上下文

Context ctx = new InitialContext(ev);

//取得文件對象

File file = new File("E:/bbb.txt");

//在服務器上綁定file,註冊名爲bbb

ctx.bind("bbb", file);

//在服務器上查找bbb對象

Object o = ctx.lookup("bbb");

//輸出對象的類名

System.out.println(o.getClass().getName());

ctx.unbind("bbb");

Object o1 = ctx.lookup("bbb");

}

3、tomcat鏈接池

web服務器也是一個jndi服務器

在Tomcate中配置數據源,在項目中利用JNDI去訪問

一、在Tomcat5.5上配置數據源

在server.xml中配置以下節點
<!-- Context節點的path屬性就是你的WebApp服務名,與上面同。
 例如:http://localhost:8080/YouWeb/index.jsp 這個是訪問你網站的URL,那麼你的path就是: /YouWeb
-->

私有數據庫鏈接池Host節點裏面)

<Context path="/YouWeb" docBase="F:\workspace\tea_forum\WebRoot">

   <Resource

     name="jdbc/sqlserver"

     type="javax.sql.DataSource"

     driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"

     maxIdle="2"

     maxWait="5000"

     username="sa"

     password="sa"

     url="jdbc:odbc:accp"

     maxActive="4"/>

</Context>

公有數據庫鏈接池

   配置公有數據庫鏈接池GlobalNamingResources節點裏面)

    <Resource

     name="jdbc/mssql"

     type="javax.sql.DataSource"

     driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"

     maxIdle="2"

     maxWait="5000"

     username="sa"

     password="sa"

     url="jdbc:odbc:accp"

     maxActive="4"/>

   引用公有數據庫鏈接池Host節點裏面)

<Context    path="/testjndi1" docBase="F:\workspace\testpool\WebRoot" >  

    <ResourceLink name="jdbc/mssql1" global="jdbc/mssql" type="javax.sql.DataSource"/>

</Context>

<Context    path="/testjndi2" docBase="F:\workspace\testpool2\WebRoot">  

    <ResourceLink name="jdbc/sqlserver2" global="jdbc/mssql" type="javax.sql.DataSource"/>

</Context>

解釋一下:

 1.path是指定訪問該web應用的URL入口;

 2.docBase指定web應用的文件路徑,能夠是絕對路徑,也能夠是相對於Host的appBase屬性的相對路徑;

 3.type是指數據源類型

 4.maxActive是DBCP中處於活動狀態的數據庫鏈接的最大數目,取0表示不受限制

 5.maxIdle是DBCP中處於空閒狀態的數據庫鏈接的最大數目,取0表示不受限制

 6.maxWait是是DBCP中的數據庫鏈接處於空閒狀態的最長時間(以毫秒爲單位)取0表示無限期等待

 7.username是數據庫登錄名

 8.password是數據庫登錄口令

 9.driverClassName是隻定數據庫的jdbc驅動程序

 10.url是指定鏈接數據庫的URL,testDBCP是個人數據庫名。


二、在你的項目工程目錄WEB-INf\web.xml中配置以下信息:
<!--注意:res-ref-name節點裏的名字要與上面的Resource節點裏的name要一致。名字能夠任意取,但必定要一致。-->
 <resource-ref>
     <res-ref-name>jdbc/sqlserver</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
 </resource-ref>
三、最後,在你和程序中使用以下代碼便可取得鏈接:
     InitialContext ctx = new InitialContext();
     //這裏的java:comp/env是前綴,java語言規範,後面跟的是你Web.xml文件中res-ref-name              節點中的名字。

     DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/server");
     Connection conn = ds.getConnection();

 

 **注意:這裏不能用java application演示

四、JSP測試文件

<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page contentType="text/html;charset=GB2312"%>
<html>
<head>
   <title>
    tomcat 鏈接池
   </title>
</head>
<body bgcolor="#ffffff">
   <h3>
    test
    <br>
    鏈接池:
   </h3>
   <%try {
    
     Context initCtx = new InitialContext();
     Context envCtx = (Context) initCtx.lookup("java:comp/env");
     DataSource ds = (DataSource) envCtx.lookup("jdbc/sqlserver");

    
     Connection conn = ds.getConnection();
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("select * from test");
     while (rs.next()) {%>

   <br>
   <%=rs.getString(1)%>
   <%}%>
   <%out.print("<br>Successful!成功!!\n");%>
   <%rs.close();
     stmt.close();
     conn.close();
    } catch (Exception e) {
     out.print("出現例外!" + e.getMessage());
     e.printStackTrace();
    }

   %>

</body>
</html>

啓動tomcat後 點擊http://localhost:8080/testDBCP/index.jsp因該能夠看到成功頁面.

相關文章
相關標籤/搜索