配置服务器范围的 JNDI 引用
你的 {CATALINA_HOME}/conf/
文件夹里面有一个 server.xml
和 context.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
,我们可以跨应用程序引用相同的数据源,并在服务器级别为多数据库系统配置它。 (虽然它也适用于一个数据库)