配置伺服器範圍的 JNDI 引用

你的 {CATALINA_HOME}/conf/資料夾裡面有一個 server.xmlcontext.xml 檔案。其中每個包含類似的程式碼,但引用 Tomcat 的不同部分來完成相同的任務

server.xml 是伺服器範圍的配置。你可以在此處設定 HTTPS,HTTP2,JNDI 資源等。

context.xml 特定於 Tomcat 中的每個上下文,取自 Tomcat 的文件,它很好地解釋了這一點:

Context 元素表示在特定虛擬主機中執行的 Web 應用程式。每個 Web 應用程式都基於 Web 應用程式歸檔(WAR)檔案或包含相應解壓縮內容的相應目錄,如 Servlet 規範(2.2 版或更高版本)中所述。有關 Web 應用程式歸檔的更多資訊,你可以下載 Servlet 規範 ,並檢視 Tomcat Application Developer’s Guide

基本上,它是特定於應用程式的配置。

為了正確操作,我們需要在 server.xml 中設定 Resource,並在 context.xml 中設定對該資源的引用。

server.xml<GlobalNamingResources> 元素中,我們將新增一個新的 <Resource>,這將是我們的 JNDI 參考:

 <GlobalNamingResources> 
    <!-- 
      JNDI Connection Pool for AS400
      Since it uses an older version of JDBC, we have to specify a validationQuery 
      to bypass errornous calls to isValid() (which doesn't exist in older JDBC)
    -->
    <Resource name="jdbc/SomeDataSource"
              auth="Container"
              type="javax.sql.DataSource"
              maxTotal="100"
              maxIdle="30"
              maxWaitMillis="10000"
              username="[databaseusername]"
              password="[databasepassword]"
              driverClassName="com.ibm.as400.access.AS400JDBCDriver"
              validationQuery="Select 1 from LIBRARY.TABLE"
              url="jdbc:as400://[yourserver]:[port]"/>

在這個例子中,我們使用了一個相當特殊的資料來源(IBMi - 執行 DB2),它需要一個 validationQuery 元素集,因為它使用的是舊版本的 JDBC。給出了這個例子,因為那裡有很少的例子,以及 JDBC 系統為你提供的互操作性的顯示,即使對於過時的 DB2 系統(如上所述)。對於其他流行的資料庫系統,類似的配置也是如此:

<Resource name="jdbc/SomeDataSource"
    auth="Container"
    type="javax.sql.DataSource"
    username="[DatabaseUsername]"
    password="[DatabasePassword]"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql:/[yourserver]:[port]/[yourapplication]"
    maxActive="15"
    maxIdle="3"/>

context.xml 內部,我們需要為我們的 jdbc 資料來源配置一個指標(我們使用 JNDI 引用):

<Context>
    ...
    <ResourceLink name="jdbc/SomeDataSource"
      global="jdbc/SomeDataSource"
      type="javax.sql.DataSource" />
</Context>

利用 context.xml 內部的 ResourceLink,我們可以跨應用程式引用相同的資料來源,並在伺服器級別為多資料庫系統配置它。 (雖然它也適用於一個資料庫)