JNDI和JDBC的區別和聯系及其使用方法


一.JNDI 和JDBC的區別和聯系
兩者都是API,是連接數據庫的標准。並不是什么產品或方法。

 

二.JDBC

全稱:Java Database Connectivity

以一種統一的方式來對各種各樣的數據庫進行存取
使用JDBC帶來的問題:
(1).數據庫服務器名稱 、用戶名和口令都可能需要改變,由此引發JDBC URL需要修改
(2).數據庫可能改用別的產品,如改用DB2或者Oracle,引發JDBC驅動程序包和類名需要修改
(3).隨着實際使用終端的增加,原配置的連接池參數可能需要調整

 

使用方法:

(1)加載數據庫驅動,填寫數據庫url,用戶名,密碼

 

(2)在程序中進行調用

 

三.JNDI

Java Naming and Directory Interface

它提供了一致的模型來存取和操作企業級的資源如DNS和LDAP

JNDI相對與JDBC來說是他的靈活性,程序員不需要關心“具體的數據庫后台是什么?JDBC驅動程序是什么?JDBC URL格式是什么?訪問數據庫的用戶名和口令是什么?”等等這些問題,程序員編寫的程序應該沒有對 JDBC 驅動程序的引用,沒有服務器名稱,沒有用戶名稱或口令 —— 甚至沒有數據庫池或連接管理。而是把這些問題交給J2EE容器來配置和管理,程序員只需要對這些配置和管理進行引用即可。 

 

使用方法:

tomcat下jndi的兩種配置方式

(一).非全局的JNDI配置:只針對某一個Web項目的數據源的配置

1.導入要鏈接數據庫的jar包文件

例如:

sqlserver導入:sqljdbc4.jar包

oracle導入:ojdbc14.jar包

mySQL導入:mysql-connector-java-5.0.8.jar包

 

2.在JNDI中配置數據庫的連接池

WEB項目中的META-INF中創建一個context.xml文件。用於設置數據庫的連接池信息

例如(mysql):

 1 <?xml version="1.0" encoding="UTF-8"?>  
 2 <Context>
 3 <!-- 
 4 JNDI數據源配置
 5 J2EE服務器上保存着一個數據庫的多個連接(連接池中),
 6 數據源被綁定在了JNDI樹上,
 7 每一個DataSource都有一個name,
 8 客戶端通過name找到在JNDI樹上綁定的DataSource,
 9 再由DataSource找到一個連接
10 |- name:表示以后要查找的名稱。通過此名稱可以找到DataSource,此名稱任意更換,但是程序中最終要查找的就是此名稱,  
11 |- auth:由容器進行授權及管理,指的用戶名和密碼是否可以在容器上生效,可以使用Container  
12 |- type:此名稱所代表的類型,現在為javax.sql.DataSource(不用變)  
13 |- maxActive:表示一個數據庫在此服務器上所能打開的最大連接數  
14 |- maxIdle:表示一個數據庫在此服務器上維持的最小連接數  
15 |- maxWait:最大等待時間。10000毫秒  
16 |- username:數據庫連接的用戶名  
17 |- password:數據庫連接的密碼  
18 |- driverClassName:數據庫連接的驅動程序  
19 |- url:數據庫連接的地址  
20 -->
21 <Resource  
22     name="jdbc/mysql"  
23     auth="Container"   
24     type="javax.sql.DataSource"  
25     maxActive="100"   
26     maxIdle="30"   
27     maxWait="10000"  
28     username="root"   
29     password="whr110112119"  
30     driverClassName="com.mysql.jdbc.Driver"  
31     url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=utf-8"/>
32 </Context>

 

3.在web.xml文件中進行配置(可配置也可以不配置)

如果要配置的話:

1.    <resource-ref>  
2.        <description>my DB Connection</description>  
3.        <res-ref-name><span style="font-family: Arial, Helvetica, sans-serif;">jdbc/sqlserver</span><span style="font-family: Arial, Helvetica, sans-serif;"></res-ref-name>這個名字要與context.xml中的name一樣</span>  
4.        <res-type>javax.sql.DataSource</res-type>  
5.        <res-auth>Container</res-auth>  
6.    </resource-ref>

其中res-ref-name值要和context.xml的name值一致

 

4.如果使用Spring的情況下

在applicationContext.xml或者自己的Spring的配置文件中導入JNDI的配置信息

1 //獲得content.xml中JNDI配置的數據庫的連接池信息。jndi-name必須與JNDI中的name值一樣
2 <jee:jndi-lookup id="dataSource"  jndi-name="jdbc/mysql" />
3 //使用JdbcTemplate操作數據庫。
4 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
5         <property name="dataSource" ref="dataSource" />
6 </bean>

在java文件中使用IOC得到jdbcTemplate對象。最后使用jdbcTemplate操作數據庫

jndi測試方法:

1.    public void testJNDI() throws NamingException, SQLException{  
2.        Context ctx = new InitialContext();  
3.        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql ");  
4.        Connection conn = ds.getConnection();  
5.        System.out.println(conn.isClosed());       
6.    }

jsp中調用加載jndi方式(不可以直接用main方法測試,必須通過啟動容器從jsp中調用):

寫測試的jsp,例如:jndiTest.jsp

1.    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>   
2.    <%@page import="com.apply.test.JNDITest"%>   
3.    <%   
4.        // 調用JNDITest類的testJNDI方法進行測試  
5.        JNDITest test = new JNDITest();  
6.        test.testJNDI();  
7.        out.println("connection pool connected !!");     
8.    %>   
9.    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
10.    <html>  
11.      <head>  
12.        <title>jndi配置測試</title>  
13.      </head>  
14.      <body>  
15.      </body>  
16.    </html>

 

5.如果不使用Spring的話,可以在java文件中直接使用:

1   //JNDI方式
2   Context ctx = new InitialContext();  
3   //獲取數據源
4   DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
5   //通過數據源取連接池中的連接
6   conn = ds.getConnection(); 

 

(二)全局的JNDI配置

1.在tomcat的安裝目錄下的conf下的server.xml文件中的GlobalNamingResources標簽下加入resource配置信息(局部JNDI在context.xml文件中的resource配置信息)

 

2.在Web項目中的META-INF下的context中配置

1 //global中的名字要與server.xml中的名稱一樣,而這里的name表示當前要使用名稱
2 <ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.DataSource"/>

 

3.剩下的和配置局部JNDI一樣,及第3,第4,第5配置完直接使用就可以了

 

總結:

如果要配置局部的話,推薦使用第一種方式,這樣不依賴tomcat了

但是還是推薦使用第二種方式好,雖然依賴tomat,但是是全局的,而且可以配置多個,對於以后切換使用方便

在項目的web.xml中添加的資源引用可有可無

 

 


免責聲明!

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



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