在server.xml还是context.xml中设置数据库连接属性

我正在尝试使用JNDI为Spring Web应用程序设置数据库连接属性。

我正在考虑以下两种方法:

方法1:

在你的Spring配置中,你可能会有类似以下内容:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/facs"/>

然后,在你的webapp /META-INF/context.xml文件中,你也应该具有类似的内容:

<?xml version='1.0' encoding='utf-8'?>

<!-- antiResourceLocking="true" -->

<Context path="/podd-apn"

reloadable="true"

cachingAllowed="false"

antiResourceLocking="true"

>

<Resource name="jdbc/facs"

type="javax.sql.DataSource" username="${database.username}" password="${database.password}"

driverClassName="org.postgresql.Driver"

url="${database.url}"

maxActive="8" maxIdle="4"

global="jdbc/facs"

/>

</Context>

在你的web.xml中,你应该像这样:

<!-- JNDI -->

<resource-ref>

<description>FACs Datasource</description>

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

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

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

</resource-ref>

方法二:

在Spring上下文中这样设置:

<jee:jndi-lookup id="dbDataSource"

jndi-name="jdbc/DatabaseName"

expected-type="javax.sql.DataSource" />

你可以使用类似下面的命令在Tomcat的server.xml中声明JNDI资源:

<GlobalNamingResources>

<Resource name="jdbc/DatabaseName" auth="Container" type="javax.sql.DataSource"

username="dbUsername" password="dbPasswd"

url="jdbc:postgresql://localhost/dbname"

driverClassName="org.postgresql.Driver"

initialSize="5" maxWait="5000"

maxActive="120" maxIdle="5"

validationQuery="select 1"

poolPreparedStatements="true"/>

</GlobalNamingResources/>

并从Tomcat的web context.xml中引用JNDI资源,如下所示:

<ResourceLink name="jdbc/DatabaseName"

global="jdbc/DatabaseName"

type="javax.sql.DataSource"/>

我的问题是保留数据库属性的最佳位置在哪里?应该将它们放置在server.xml还是context.xml中?

另外,如果我有2个数据库,是否应该使用两个配置?

另外,最佳做法是直接将它们放置在server.xml或context.xml中吗?还是需要通过Tomcat Manager GUI控制台进行配置?

回答:

我更喜欢第三种方法,该方法从 user1016403描述的方法1和方法2 中获得最大的收益。

方法3

1. 将数据库属性保存在 server.xml

2. server.xml从Web应用程序引用数据库属性META-INF/context.xml

方法3的好处

尽管出于安全原因第一点很有用,但第二点对于从Web应用程序引用服务器属性值也是有用的,即使服务器属性值会发生变化。

此外,将服务器上的资源定义与Web应用程序的使用脱钩可以使这种配置在具有各种复杂性的组织之间可扩展,其中不同的团队在不同的层/层上工作:如果管理员共享相同的资源,则服务器管理员团队可以在不与开发人员团队冲突的情况下工作每个资源的开发人员的JNDI名称。

方法3的实施

定义JNDI名称jdbc/ApplicationContext_DatabaseName

使用类似这样的声明jdbc/ApplicationContext_DatabaseName在Tomcat的各种属性和值server.xml

<GlobalNamingResources>

<Resource name="jdbc/ApplicationContext_DatabaseName" auth="Container" type="javax.sql.DataSource"

username="dbUsername" password="dbPasswd"

url="jdbc:postgresql://localhost/dbname"

driverClassName="org.postgresql.Driver"

initialSize="5" maxWait="5000"

maxActive="120" maxIdle="5"

validationQuery="select 1"

poolPreparedStatements="true"/>

</GlobalNamingResources/>

jdbc/ApplicationContext_DatabaseName通过属性META-INF/context.xmljava:comp/env/指定的应用程序专用JNDI上下文从网络应用程序链接的name属性:

<Context path="/ApplicationContext" ... >

<!--

"global" attribute links to GlobalNamingResources in the ${catalina.base}/conf/server.xml (server administrator team)

"name" attribute is relative to the application-private JNDI context java:comp/env/ and is looked up from the java web application (application developer team)

-->

<ResourceLink global="jdbc/ApplicationContext_DatabaseName" name="jdbc/DatabaseName" type="javax.sql.DataSource"/>

</Context>

最后,为了使用JNDI资源,请jdbc/DatabaseName在Web应用程序的部署描述符中指定JNDI名称:

<resource-ref>

<description>DatabaseName's Datasource</description>

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

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

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

</resource-ref>

在Spring上下文中:

<jee:jndi-lookup id="DatabaseNameDataSource"

jndi-name="jdbc/DatabaseName"

expected-type="javax.sql.DataSource" />

方法3的缺点

如果JNDI名称被更改,则必须同时编辑和server.xml和,META-INF/context.xml并且必须进行部署。但是,这种情况很少见。

方法3的变化

一个Web应用程序使用的许多数据源

只需将配置添加到Tomcat的server.xml

<GlobalNamingResources>

<Resource name="jdbc/ApplicationContext_DatabaseName1" ... />

<Resource name="jdbc/ApplicationContext_DatabaseName2" ... />

...

</GlobalNamingResources/>

META-INF/context.xml通过属性中java:comp/env/指定的应用程序专用JNDI上下文添加链接Web应用程序name:

<Context path="/ApplicationContext" ... >

<ResourceLink global="jdbc/ApplicationContext_DatabaseName1" name="jdbc/DatabaseName1" ... />

<ResourceLink global="jdbc/ApplicationContext_DatabaseName2" name="jdbc/DatabaseName2" ... />

...

</Context>

最后,在Web应用程序的部署描述符中添加JNDI资源使用情况:

<resource-ref>

<description>DatabaseName1's Datasource</description>

<res-ref-name>jdbc/DatabaseName1</res-ref-name> ...

</resource-ref>

<resource-ref>

<description>DatabaseName2's Datasource</description>

<res-ref-name>jdbc/DatabaseName2</res-ref-name> ...

</resource-ref>

...

在Spring上下文中:

<jee:jndi-lookup id="DatabaseName1DataSource"

jndi-name="jdbc/DatabaseName1" ... />

<jee:jndi-lookup id="DatabaseName2DataSource"

jndi-name="jdbc/DatabaseName2" ... />

...

同一台服务器上的许多Web应用程序使用的许多数据源

只需将配置添加到Tomcat的server.xml

<GlobalNamingResources>

<Resource name="jdbc/ApplicationContextX_DatabaseName1" ... />

<Resource name="jdbc/ApplicationContextX_DatabaseName2" ... />

<Resource name="jdbc/ApplicationContextY_DatabaseName1" ... />

<Resource name="jdbc/ApplicationContextY_DatabaseName2" ... />

...

</GlobalNamingResources/>

其他配置应该可以从以前的变化情况中得出。

同一服务器上许多Web应用程序使用的同一数据库的许多数据源

在这种情况下,Tomcat的server.xml配置如下:

<GlobalNamingResources>

<Resource name="jdbc/ApplicationContextX_DatabaseName" ... />

<Resource name="jdbc/ApplicationContextY_DatabaseName" ... />

最终出现在两个不同的Web应用程序中,META-INF/context.xml 例如:

<Context path="/ApplicationContextX" ... >

<ResourceLink global="jdbc/ApplicationContextX_DatabaseName" name="jdbc/DatabaseName" ... />

</Context>

像:

<Context path="/ApplicationContextY" ... >

<ResourceLink global="jdbc/ApplicationContextY_DatabaseName" name="jdbc/DatabaseName" ... />

</Context>

所以有人可能会担心的是,同样name="jdbc/DatabaseName"是抬起头,然后使用由部署在同一服务器上的两个不同的应用程序:这不是一个问题,因为jdbc/DatabaseName是一个应用程序私有JNDI上下文java:comp/env/,因此ApplicationContextX 使用java:comp/env/不能(根据设计)查找链接到的资源global="jdbc/ApplicationContextY_DatabaseName"

当然,如果你放心而又不用担心,可以使用其他命名策略,例如:

<Context path="/ApplicationContextX" ... >

<ResourceLink global="jdbc/ApplicationContextX_DatabaseName" name="jdbc/applicationXprivateDatabaseName" ... />

</Context>

像:

<Context path="/ApplicationContextY" ... >

<ResourceLink global="jdbc/ApplicationContextY_DatabaseName" name="jdbc/applicationYprivateDatabaseName" ... />

</Context>

以上是 在server.xml还是context.xml中设置数据库连接属性 的全部内容, 来源链接: utcz.com/qa/416570.html

回到顶部