1. 程式人生 > >idea中配置JNDI資料來源

idea中配置JNDI資料來源

前言

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

JNDI簡介

JNDI(Java Naming and Directory Interface,Java命名和目錄介面)是SUN公司提供的一種標準的Java命名系統介面,JNDI提供統一的客戶端API,通過不同的訪問提供者介面JNDI服務供應介面(SPI)的實現,由管理者將JNDI API對映為特定的命名服務和目錄系統,使得Java應用程式可以和這些命名服務和目錄服務之間進行互動。
JNDI程式包:
javax.naming:命名操作;
javax.naming.directory:目錄操作;
javax.naming.event:在命名目錄伺服器中請求事件通知;
javax.naming.ldap:提供LDAP支援;
javax.naming.spi:允許動態插入不同實現。
資料來源的由來


在Java開發中,使用JDBC操作資料庫的四個步驟如下:

  1. 載入資料庫驅動程式Class.forName(“資料庫驅動類”);
  2. 連線資料庫Connection con = DriverManager.getConnection()
  3. 操作資料庫PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery()
  4. 關閉資料庫,釋放連線con.close()

也就是說,所有的使用者都需要經過此四步進行操作,但是這四步之中有三步(①載入資料庫驅動程式、②連線資料庫、④關閉資料庫,釋放連線)對所有人都是一樣的,而所有人只有在操作資料庫上是不一樣,那麼這就造成了效能的損耗。也就是說,所有的使用者都需要經過此四步進行操作,但是這四步之中有三步(①載入資料庫驅動程式、②連線資料庫、④關閉資料庫,釋放連線)對所有人都是一樣的,而所有人只有在操作資料庫上是不一樣,那麼這就造成了效能的損耗。
  那麼最好的做法是,準備出一個空間,此空間裡專門儲存著全部的資料庫連線,以後使用者用資料庫操作的時候不用再重新載入驅動、連線資料庫之類的,而直接從此空間中取走連線,關閉的時候直接把連線放回到此空間之中。
  那麼此空間就可以稱為連線池(儲存所有的資料庫連線),但是如果要想實現此空間的話,則必須有一個問題要考慮?
 1、 如果沒有任何一個使用者使用連線,那麼那麼應該維持一定數量的連線,等待使用者使用。
 2、 如果連線已經滿了,則必須開啟新的連線,供更多使用者使用。
 3、 如果一個伺服器就只能有100個連線,那麼如果有第101個人過來呢?應該等待其他使用者釋放連線
 4、 如果一個使用者等待時間太長了,則應該告訴使用者,操作是失敗的。
  如果直接用程式實現以上功能,則會比較麻煩,所以在Tomcat 4.1.27之後,在伺服器上就直接增加了資料來源的配置選項,直接在伺服器上配置好資料來源連線池即可。在J2EE伺服器上儲存著一個數據庫的多個連線。每一個連線通過DataSource可以找到。DataSource被繫結在了JNDI樹上(為每一個DataSource提供一個名字)客戶端通過名稱找到在JNDI樹上繫結的DataSource,再由DataSource找到一個連線。如下圖所示:
在這裡插入圖片描述


那麼在以後的操作中,除了資料庫的連線方式不一樣之外,其他的所有操作都一樣,只是關閉的時候不是徹底地關閉資料庫,而是把資料庫的連線放回到連線池中去。
  如果要想使用資料來源的配置,則必須配置虛擬目錄,因為此配置是在虛擬目錄之上起作用的。需要注意的是,如果要想完成以上的功能,在Tomcat伺服器上一定要有各個資料庫的驅動程式。

實操

在網上看到很多實現方法,這裡記錄下我成功的方法。
本專案中,由於比較老就是jsp專案,先新增框架的支援,新增maven。
在這裡插入圖片描述
在這裡插入圖片描述
選擇maven即可
現在開始配置JNDI

第一步,建立一個context.xml檔案,這個檔案可以從tomcat/conf/context.xml複製一份
在這裡插入圖片描述


在這裡插入圖片描述
需要注意的是:Context.xml檔案,節點需要注意大小寫,這個檔案一定要寫對。並且Resource是單便籤,寫成雙標籤的…就會無效
會報Failed to create MBean for naming resource [null]異常
當初因為寫成了…的雙標籤格式,結果讀取不出來配置
在這裡插入圖片描述
這是stackoverflow上的解答,同樣的問題

第二步,配置web.xml檔案
在這裡插入圖片描述
寫好resource-ref節點
第三步,設定project structure
快速的配置好web專案一些路徑什麼的,對idea熟悉的應該很快就配好

Facets中
在這裡插入圖片描述
配置tomcat Context,沒有這個就點選Add Application Server Specific descriptor新增上,路徑就是剛剛建好的context.xml檔案
在idea中這樣配置context後就不需要在手工修改tomcat中的context.xml配置檔案了,這也是idea的方便之處

經過這三步JNDI就配置好啦,現在有個測試程式碼片段
在這裡插入圖片描述
需要注意的是,不能使用這種方式來test,它需要執行在tomcat環境裡,不然會報錯
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
把這段程式碼寫在service層測試即可