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
-->
u 私有數據庫鏈接池(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> |
u 公有數據庫鏈接池
配置公有數據庫鏈接池(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因該能夠看到成功頁面.