1. 程式人生 > >什麼是jndi,什麼時候使用jndi,tomcat配置jndi,spring使用jndi資料來源

什麼是jndi,什麼時候使用jndi,tomcat配置jndi,spring使用jndi資料來源

JNDI 是什麼

JNDI是 Java 命名與目錄介面(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一,不少專家認為,沒有透徹理解JNDI的意義和作用,就沒有真正掌握J2EE特別是EJB的知識。

那麼,JNDI到底起什麼作用?

要了解JNDI的作用,我們可以從“如果不用JNDI我們怎樣做?用了JNDI後我們又將怎樣做?”這個問題來探討。

沒有JNDI的做法:

程式設計師開發時,知道要開發訪問MySQL資料庫的應用,於是將一個對 MySQL JDBC 驅動程式類的引用進行了編碼,並通過使用適當的 JDBC URL 連線到資料庫。
就像以下程式碼這樣:

  1. Connection conn=null;  
  2. try {  
  3. Class.forName("com.mysql.jdbc.Driver",  
  4. true, Thread.currentThread().getContextClassLoader());  
  5. conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");  
  6. /* 使用conn並進行SQL操作 */
  7. ......  
  8. conn.close();  
  9. }   
  10. catch(Exception e) {  
  11. e.printStackTrace();  
  12. }   
  13. finally {  
  14. if(conn!=null) {  
  15. try {  
  16. conn.close();  
  17. catch(SQLException e) {}  
  18. }  

這是傳統的做法,也是以前非Java程式設計師(如Delphi、VB等)常見的做法。這種做法一般在小規模的開發過程中不會產生問題,只要程式設計師熟悉Java語言、瞭解JDBC技術和MySQL,可以很快開發出相應的應用程式。

沒有JNDI的做法存在的問題:

1、資料庫伺服器名稱MyDBServer 、使用者名稱和口令都可能需要改變,由此引發JDBC URL需要修改;

2、資料庫可能改用別的產品,如改用DB2或者Oracle,引發JDBC驅動程式包和類名需要修改;

3、隨著實際使用終端的增加,原配置的連線池引數可能需要調整;

4、......

解決辦法:

程式設計師應該不需要關心“具體的資料庫後臺是什麼?JDBC驅動程式是什麼?JDBC URL格式是什麼?訪問資料庫的使用者名稱和口令是什麼?”等等這些問題,程式設計師編寫的程式應該沒有對 JDBC 驅動程式的引用,沒有伺服器名稱,沒有使用者名稱稱或口令 —— 甚至沒有資料庫池或連線管理。而是把這些問題交給J2EE容器來配置和管理,程式設計師只需要對這些配置和管理進行引用即可。

由此,就有了JNDI。

用了JNDI之後的做法:

首先,在在J2EE容器中配置JNDI引數,定義一個數據源,也就是JDBC引用引數,給這個資料來源設定一個名稱;然後,在程式中,通過資料來源名稱引用資料來源從而訪問後臺資料庫。

具體操作如下(以JBoss為例):

1、配置資料來源

在JBoss的 D:/jboss420GA/docs/examples/jca 資料夾下面,有很多不同資料庫引用的資料來源定義模板。將其中的 mysql-ds.xml 檔案Copy到你使用的伺服器下,如 D:/jboss420GA/server/default/deploy。

修改 mysql-ds.xml 檔案的內容,使之能通過JDBC正確訪問你的MySQL資料庫,如下:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <datasources>
  3. <local-tx-datasource>
  4. <jndi-name>MySqlDS</jndi-name>
  5. <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>
  6. <driver-class>com.mysql.jdbc.Driver</driver-class>
  7. <user-name>root</user-name>
  8. <password>rootpassword</password>
  9. <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
  10. <metadata>
  11. <type-mapping>mySQL</type-mapping>
  12. </metadata>
  13. </local-tx-datasource>
  14. </datasources>

這裡,定義了一個名為MySqlDS的資料來源,其引數包括JDBC的URL,驅動類名,使用者名稱及密碼等。

2、在程式中引用資料來源:

  1. Connection conn=null;  
  2. try {  
  3. Context ctx=new InitialContext();  
  4. Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用資料來源 
  5. DataSource ds=(Datasource)datasourceRef;  
  6. conn=ds.getConnection();  
  7. /* 使用conn進行資料庫SQL操作 */
  8. ......  
  9. c.close();  
  10. }   
  11. catch(Exception e) {  
  12. e.printStackTrace();  
  13. }   
  14. finally {  
  15. if(conn!=null) {  
  16. try {  
  17. conn.close();  
  18. catch(SQLException e) { }  
  19. }  

直接使用JDBC或者通過JNDI引用資料來源的程式設計程式碼量相差無幾,但是現在的程式可以不用關心具體JDBC引數了。
在系統部署後,如果資料庫的相關引數變更,只需要重新配置 mysql-ds.xml 修改其中的JDBC引數,只要保證資料來源的名稱不變,那麼程式原始碼就無需修改。

由此可見,JNDI避免了程式與資料庫之間的緊耦合,使應用更加易於配置、易於部署。

JNDI的擴充套件:JNDI在滿足了資料來源配置的要求的基礎上,還進一步擴充了作用:所有與系統外部的資源的引用,都可以通過JNDI定義和引用。

所以,在J2EE規範中,J2EE 中的資源並不侷限於 JDBC 資料來源。引用的型別有很多,其中包括資源引用(已經討論過)、環境實體和 EJB 引用。特別是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一項關鍵角色:查詢其他應用程式元件。

EJB 的 JNDI 引用非常類似於 JDBC 資源的引用。在服務趨於轉換的環境中,這是一種很有效的方法。可以對應用程式架構中所得到的所有元件進行這類配置管理,從 EJB 元件到 JMS 佇列和主題,再到簡單配置字串或其他物件,這可以降低隨時間的推移服務變更所產生的維護成本,同時還可以簡化部署,減少整合工作。 外部資源”。

總 結:

J2EE 規範要求所有 J2EE 容器都要提供 JNDI 規範的實現。JNDI 在 J2EE 中的角色就是“交換機” —— J2EE 元件在執行時間接地查詢其他元件、資源或服務的通用機制。在多數情況下,提供 JNDI 供應者的容器可以充當有限的資料儲存,這樣管理員就可以設定應用程式的執行屬性,並讓其他應用程式引用這些屬性(Java 管理擴充套件(Java Management Extensions,JMX)也可以用作這個目的)。JNDI 在 J2EE 應用程式中的主要角色就是提供間接層,這樣元件就可以發現所需要的資源,而不用瞭解這些間接性。

在 J2EE 中,JNDI 是把 J2EE 應用程式合在一起的粘合劑,JNDI 提供的間接定址允許跨企業交付可伸縮的、功能強大且很靈活的應用程式。這是 J2EE 的承諾,而且經過一些計劃和預先考慮,這個承諾是完全可以實現的。

最近一直在對J2EE的筆記進行整理和複習,雖然J2EE視訊是看過一遍了,但是當我看自己做的筆記的時候陌生程度還是很大,而真正的對某個概念有所認識的時候是將筆記和以前看過的視訊印象進行摩擦,J2EE主要講解的內容是各個規範,再清楚一些就是各個概念,現階段的目標並不是掌握J2EE,而是對J2EE進行輪廓和概念上的瞭解和認識,到下一步DRP專案中再深層次的對各個規範進行摩擦和認識。

JNDI,翻譯為Java命名和目錄結構(JavaNaming And Directory Interface)官方對其解釋為JNDI是一組在Java應用中訪問命名和目錄服務的API(ApplicationProgramming Interface)說明很精煉,但是比較抽象。

上面的解釋中提高了命名服務和目錄服務兩個概念.先要了解JNDI就必須知道,命名服務和目錄服務是做什麼用的。

學習新的概念和知識,比較有效的方式是通過和以前所學過的內容進行聯絡,比較。

關於命名服務,其實我們很多時候都在用它,但是並不知道它是它,比較典型的是域名伺服器DNS(Domain Naming Service),大對人對DNS還是比較瞭解的,它是將域名對映到IP地址的服務.比如百度的域名www.baidu.com所對映的IP地址是http://202.108.22.5/,你在瀏覽器中輸入兩個內容是到的同一個頁面.用命名伺服器的原因是因為我們記憶baidu這幾個有意義的字母要比記202.108.22.5更容易記憶,但如果站到計算機的角度上,它更喜歡處理這些數字。

從我們生活中找的話還有很多類似的例子,比如說你的身份證號和你的名字可以"理解"成一種命名服務,你的學號和姓名也可以"解釋"為一種命名服務。

可以看出命名服務的特點:一個值和另一個值的對映,將我們人類更容易認識的值同計算機更容易認識的值進行一一對映。

到現在應該對命名服務有所理解吧?

至於目錄服務,從計算機角度理解為在網際網路上有著各種各樣的資源和主機,但是這些內容都是散落在網際網路中,為了訪問這些散落的資源並獲得相應的服務,就需要用到目錄服務。

從我們日常生活中去理解目錄服務的概念可以從電話簿說起,電話簿本身就是一個比較典型的目錄服務,如果你要找到某個人的電話號碼,你需要從電話簿裡找到這個人的名稱,然後再看其電話號碼。

 

理解了命名服務和目錄服務再回過頭來看JDNI,它是一個為Java應用程式提供命名服務的應用程式介面,為我們提供了查詢和訪問各種命名和目錄服務的通用統一的介面.通過JNDI統一介面我們可以來訪問各種不同型別的服務.如下圖所示,我們可以通過JNDI API來訪問剛才談到的DNS。

至此已經對JNDI有了一個初步認識,如果想要進一步瞭解JNDI,並對使用JDNI給我們帶來哪些便利之處,我推薦兩篇關於JDNI的文章,寫的非常的好,兩篇文章從“如果不用JNDI我們怎樣做?用了JNDI後我們又將怎樣做?”這個角度來加深對JNDI的認識。

---------------------------------------------------

什麼時候使用jndi?

一般我們使用jndi資料來源的時候,伺服器一般用的是weblogic和websphere等提供資料來源的伺服器。

-----------------------------------------

tomcat配置jndi資料來源:

server.xml

[html] view plain copy  print?
  1. <Contextpath="/demo"docBase="E:\webdemo"reloadable="true">
  2.             <ManagerclassName="org.apache.catalina.session.PersistentManager">
  3.             debug=0saveOnRestart="true"
  4.             maxActiveSession="-1"minIdleSwap="-1"
  5.             maxIdleSwap="-1"maxIdleBackup="-1"
  6.             <Store
  7.             className="org.apache.catalina.session.FileStore"
  8.             directory="d:\temp"/>
  9.             </Manager>
  10.             <Resourcename="jdbc/mydata"
  11.             auth="Container"
  12.             type="javax.sql.DataSource"
  13.             maxActive="100"
  14.             maxIdle="30"
  15.             maxWait="10000"
  16.             username="root"
  17.             password="root"
  18.             driverClassName="com.mysql.jdbc.Driver"
  19.             url="jdbc:mysql://localhost:8080/mydata"/>
  20.         </Context>


Tomcat 資料來源  -- 原理、配置、使用

      在程式程式碼之中使用資料來源可以提升操作效能的,這種效能提升依靠執行的操作原理


傳統JDBC 使用過程中存在以下四個步驟:

     1、載入驅動程式

     2、進行資料庫連線

     3、資料庫操作

     4、資料庫關閉

對於不同的使用者只有操作不同,但是對於1、2、4三個步驟很明顯是一個重複的操作

       如果開發中直接使用JDBC 操作的話,那麼就回產生這種效能的問題,那麼這麼做才是最合適的呢?

     

JNDI屬於命名及目錄查詢介面,主要的功能是用於進行查詢的,查詢物件

但是,現在的資料庫的連線池是需要在Tomcat上完成配置的。

 要修改server.xml 檔案才可以起作用

[html] view plain copy  print?
  1. <Resourcename="jdbc/mydata"
  2. auth="Container"
  3. type="javax.sql.DataSource"
  4. maxActive="100"
  5. maxIdle="30"
  6. maxWait="10000"
  7. username="root"
  8. password="root"
  9. driverClassName="com.mysql.jdbc.Driver"
  10. url="jdbc:mysql://localhost:8080/mydata"/>


   此配置中有幾個引數

name: 表示資料來源的名稱,也是要查詢的名稱

auth:表示由容器負責資源的連線

type:表示物件,資料來源上每一個繫結的都是DataSource

maxActive: 表示最大連線數

minIdle:表示最小維持數量

maxWait:最大等待時間

對於連線的授權有兩種: Container、Application(應用程式必須程式化的登入到資源管理器)

如果現在假設是oracle 資料庫的話,則直接換啟動程式即可

[html] view plain copy  print?
  1. <Resourcename="jdbc/orcl"
  2. auth="Container"
  3. type="javax.sql.DataSource"
  4. maxActive="100"
  5. maxIdle="30"
  6. maxWait="10000"
  7. username="scott"
  8. password="tiger"
  9. driverClassName="oracle.jdbc.driver.OracleDriver"
  10. url="jdbc:oracle:thin:@localhost:1521:orcl"/>
       但是現在使用tomcat 版本是6.0 ,所以要想讓一個數據源起作用的話,還必須在web.xml 檔案之中完成配置

<resource-ref>

    <res-ref-name>jdbc/mydata</res-ref-name>

    <res-type>javax.sql.DataSource</res-type>

   <res-auth>Container</res-auth>

</resource-ref>

查詢資料來源

   資料來源的操作使用的是JNDI 方式進行查詢的,所以如果要想使用資料來源取得資料庫連線的話,則必須按照如下的步驟進行

初始化名稱查詢上下文: Context ctx = new IntialContext();

通過名稱查詢DataSource 物件: DataSource ds = (DataSource)ctx.lookup(JNDI名稱)

通過DataSource 取得一個數據庫連線; Connection conn = ds.getConnection();

[html] view plain copy  print?
  1. <HTML>
  2.  <HEAD>
  3.   <TITLE> New Document </TITLE>
  4.  <BODY>
  5. <%  
  6.     String DSNAME = "jdbc/mydata";   //名稱  
  7.     Context ctx = new InitialContext();  
  8.     DataSource ds = (DataSource) ctx.lookup(DSNAME);  
  9.     Connection conn = ds.getConnection();  //從連線池中取連線  
  10. %>
  11. <%=conn%>
  12. <%  
  13.     conn.close();  //表示將連線放回到池子中  
  14. %>
  15.  </BODY>
  16. </HTML>

現在提示沒有名稱被發現

實際上對於這種資源的操作,本身是需要一個環境屬性的支援的: java:comp/env, 但是Tomcat 伺服器本身是免費,那麼沒有對這種屬性提供支援,所以如果要想訪問Tomcat中的名稱服務的話,則肯定要在前面加上此屬性,即,現在的名稱是:java:comp/env/jdbc/mydata

以後程式中只認名字,而具體是哪個資料將由配置決定

當然: 如果現在使用的是DAO 開發的,DatabaseConnection.java類

[java] view plain 

相關推薦

tomcat配置jndi+spring使用jndi資料來源

1.JNDI 是什麼 JNDI是 Java 命名與目錄介面(Java Naming and Directory Interface) 2.JNDI到底起什麼作用? 2.1傳統的做法JDBC  建立一個以JDBC連線資料庫的程式,包含7個步驟:

Tomcat配置JNDI資料來源的三種方式

在我過去工作的過程中,開發用伺服器一般都是Tomcat資料來源的配置往往都是在applicationContext.xml中配置一個dataSource的bean然後在部署時再修改JNDI配置我猜是因為Tomcat的配置需要改配置檔案不像JBoss,Weblogic等伺服器在

什麼是jndi,什麼時候使用jndi,tomcat配置jndi,spring使用jndi資料來源

JNDI 是什麼 JNDI是 Java 命名與目錄介面(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一,不少專家認為,沒有透徹理解JNDI的意義和作用,就沒有真正掌握J2EE特別是EJB的知識。 那麼,JND

tomcat配置jndi資料來源

在tomcat中加全域性資料庫連線 server.xml檔案修改 ,在<GlobalNamingResources>節點加下面紅色字型的配置 <GlobalNamingResources>     <!-- Editable user da

Tomcat配置JNDI資源(Tomcat配置連線池)

Tomcat配置連線池 在你的tomcat的conf路徑下的Catalina下建立一個與你的web專案相同名字的xml檔案進行如下配置 <?xml version="1.0" encoding=

關於Tomcat配置MySQL的資料來源

1. 首先需要資料庫的JDBC驅動,然後放到Tomcat的lib資料夾裡驅動可以去官網下載。2. 然後到\Tomcat 9.0\conf\Catalina\localhost\路徑下新建一個.xml檔案,名字可以任意我這裡新建的是asd.xml程式碼如下:<Contex

Tomcat配置資料來源步驟以及使用JNDI

1、 配置Tomcat的conf/context.xml <Resource name="jdbc/news"                auth="Container"  type="javax.sql.DataSource"  maxActive="100"                ma

IDEA社群版中maven-tomcat外掛配置JNDI資料來源

前言:   由於在學習過程中,教程是使用eplices進行的,而我自己是使用IDEA,所以把配置過程記錄下來   執行環境:OSX 10 、IDEA社群版、Java8、mysql 5.1.38、to

JNDI學習總結(二):tomcat配置全域性和私有JNDI資料來源的幾種方式

下面介紹幾種常用的JNDI資料來源配置方式環境:IDEA+tomcat7全域性:1. 修改tomcat的context.xml的<context>標籤  在<context>標籤

JNDI數據源(在Tomcat配置JNDI多數據源實例)

更新 urn post sele define 網上 def pack finally 一,添加數據庫驅動包加入classpath。 這裏我用到了oracle和mysql。所以由兩個jar包:ojdbc14.jar和mysql-connector-java-5.1.13-b

Jboss7配置JNDI資料來源

Jboss7配置JNDI資料來源 1.首先先配置資料庫驅動module 例如:我這裡使用的是PostgreSQL資料庫 在Jboss7安裝目錄下的modules下配置我們的驅動module,配置方式如下圖 module.xml檔案的內容(注意檔名稱必須為

JNDI學習總結(一)——JNDI資料來源配置

一、資料來源的由來   在Java開發中,使用JDBC操作資料庫的四個步驟如下:       ①載入資料庫驅動程式(Class.forName("資料庫驅動類");)       ②連線資料庫(Connection con  = DriverManager.getConnection();)

配置Jndi資料來源遇到的一個問題

因為之前大多配置的是jdbc連線方式,偶然一次用到了jndi連線方式,遇到了個比較頭疼的問題,故記錄下來,方便以後查閱.異常如下:Caused by: javax.naming.NameNotFoundException: Name mysqlDataSource is no

如何配置TomcatJNDI (以oracle資料庫為例子)

定義:JNDI(Java Naming and Directory Interface,Java命名和目錄介面) 是一組在Java應用中訪問命名和目錄服務的API 1. Install Your JDBC Driver    把ojdbc14.jar放入Tomcat的li

JNDI+Spring獲取配置資料來源的三種方法

一 環境:XP+Myeclipse6.6+Tomcat7+JDK1.6 二 具體步驟如下: bean.xml中配置:  Java程式碼   <bean id="dataSource" class="org.springframework.jndi.JndiO

Tomcatjndi的三種配置方式

Java命名和目錄介面(the Java naming and directory interface,JNDI)是一組在Java應用中訪問命名和目錄服務的API。命名服務將名稱和物件聯絡起來,使得讀者可以用名稱訪問物件。目錄服務是一種命名服務,在這種服務裡,物件不但有名稱,還有屬性 tomcat配置j

以oracle資料庫為例配置Tomcat伺服器JNDI資料庫連線池

前兩天學習了tomcat的JNDI資料庫連線池的配置,今天重新自己檢視tomcat的官方英語文件再配置一遍,加深印象。 首先JNDI(Java Naming and Directory Interface,Java命名和目錄介面)是一組在Java應用中訪問命名和目錄服務的A

idea中配置JNDI資料來源

前言 在公司接觸一個報表專案時,發現裡面使用的JNDI配置的資料來源,在web.xml中有resource-ref這個標籤,這種方式跟傳統的JDBC連線還是有些區別 JNDI簡介 JNDI(Java Naming and Directory Interface,

Spring中配置JNDI資料來源

server.xml下 <GlobalNamingResources></GlobalNamingResources>中的配置     <Resource         auth="Container"         description="DB Connection"

WebLogic配置JNDI數據源

是否 j2e att teacher blog root oot c3p0 web.xml 一、什麽是jndi數據源 JNDI是Java命名與目錄接口(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一。 我們平時開