我正在尝试使用JNDI为Spring Web应用程序设置数据库连接属性 .
我正在考虑以下两种方法:
Approach 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>
Approach 2:
在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控制台进行配置?
谢谢!
5 回答
我更喜欢从 Approach 1 和 Approach 2 described by user1016403获得最佳效果的第三种方法 .
方法3
在
server.xml
上保存数据库属性从Web应用程序
META-INF/context.xml
引用server.xml
数据库属性方法3的好处
虽然第一点对于安全性原因很有用,但第二点对于从Web应用程序引用服务器属性值很有用,即使服务器属性值会发生变化也是如此 .
此外,将服务器上的资源定义与Web应用程序的使用分离使得这种配置可以在具有各种复杂性的组织中进行扩展,其中不同的团队在不同的层/层上工作:如果管理员共享相同的服务器管理员团队,则可以在不与开发人员团队冲突的情况下工作JNDI名称与每个资源的开发人员 .
方法3实施
定义JNDI名称
jdbc/ApplicationContext_DatabaseName
.使用以下内容声明
jdbc/ApplicationContext_DatabaseName
's various properties and values in Tomcat' sserver.xml
:通过
name
属性中指定的应用程序专用JNDI上下文java:comp/env/
从Web应用程序META-INF/context.xml
链接jdbc/ApplicationContext_DatabaseName
的属性:最后,为了使用JNDI资源,请在Web应用程序的部署描述符中指定JNDI名称
jdbc/DatabaseName
:并在Spring上下文中:
接近3个缺点
如果更改了JNDI名称,则必须编辑
server.xml
和META-INF/context.xml
并且必须进行部署;尽管如此,这种情况很少见 .接近3种变化
Many data sources used by one web application
只需将配置添加到Tomcat的
server.xml
:通过
name
属性中指定的应用程序专用JNDI上下文java:comp/env/
添加链接Web应用程序META-INF/context.xml
:最后在Web应用程序的部署描述符中添加JNDI资源使用情况:
并在Spring上下文中:
Many data sources used by many web application on the same server
只需将配置添加到Tomcat的
server.xml
:其他配置应该可以从以前的变异案例中推断出来 .
Many data sources to the same database used by many web application on the same server
在这种情况下,Tomcat的
server.xml
配置如下:最终在两个不同的Web应用程序
META-INF/context.xml
喜欢:并喜欢:
所以有人可能会担心同一个服务器上部署的两个不同应用程序查找并使用相同的事实:这不是问题,因为
jdbc/DatabaseName
是应用程序私有JNDI上下文java:comp/env/
,所以ApplicationContextX
by using java:comp/env/ 不能(通过设计)查找链接到global="jdbc/ApplicationContextY_DatabaseName"
的资源 .当然,如果您在没有这种担心的情况下感到更放松,您可以使用不同的命名策略,例如:
并喜欢:
我更喜欢方法2(放置所有东西(不仅是配置中的一些属性),
但是不应将它们放在全局
server.xml
或全局context.xml
中,而应将它放在tomcat中特定于应用程序的context.xml.defaultYOUR_APP.xml
中 .YOUR_APP.xml
文件位于$catalinaHome/conf/<engine>/<host>
(例如conf / Catalina / localhost / YOUR_APP.xml) .特定应用程序
YOUR_APP.xml
中的配置仅适用于特定应用程序 .Approach 4
而不是使用JNDI我使用
.properties
文件并在程序初始化期间而不是在配置时构建复杂对象 .你已经使用了Spring,很容易构造
DataSource
:我完全同意 Ralph 在
$CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml
中使用部署描述符,而是JNDI我喜欢普通的键值文件!使用Spring将以上属性注入bean字段很容易:
而不是JNDI:
另请注意,EL允许这样做(默认值和深度递归替换):
要外化
.properties
文件,我使用具有org.apache.catalina.loader.VirtualWebappLoader的现代Tomcat 7:所以你的devops用本地外部完整路径填充
virtualClasspath
,每个应用程序是独立的,并将本地app.properties
放到该目录 .也可以看看:
Adding a directory to tomcat classpath
Can I create a custom classpath on a per application basis in Tomcat
Externalizing Tomcat webapp config from .war file
How to read a properties file outside my webapp context in Tomcat
Configure Tomcat to use properties file to load DB connection information
Externalize Tomcat configuration
您还可以将JNDI URL支持用于不同的应用程序配置,以进行测试,集成测试和 生产环境 .
查看GitHub项目Tomcat JNDI URL Support以启用对Tomcat服务器的JNDI URL支持 .
第1步:context.xml
第2步:web.xml
第3步:创建一个类来获取连接
一切都准备好了