如何在tomcat 8中正确配置jndi数据源
Posted
技术标签:
【中文标题】如何在tomcat 8中正确配置jndi数据源【英文标题】:how to correctly configure jndi data source in tomcat 8 【发布时间】:2015-02-11 13:25:03 【问题描述】:我尝试在
中为我的应用程序配置 jsbc 数据源-tomcat_home-\conf\Catalina\localhost
我的应用是“reportExport”.war,所以我用这个内容创建了 reportExport.xml:
<Context>
<Resource name="jdbc/mssql" auth="Container" type="javax.sql.DataSource"
username="user"
password="pass"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:52015;databaseName=rewe;integratedSecurity=false;"
maxActive="20"
maxIdle="10"
validationQuery="select 1" />
</Context>
我在 web.xml 中添加了这个:
<resource-ref>
<description>
This app requires a ms sql connection.
</description>
<res-ref-name>
jdbc/mssql
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
也许我可以省略我已经在 reportExport.xml 中给出的字段?!
在 Java 中,我尝试获得这样的连接:
((DataSource) (new InitialContext()).lookup("java:comp/env/jdbc/mssql")).getConnection()
在 java 中连接正常,但有 2 个问题。
第一个问题是:如果我在部署应用程序之前将reportExport.xml放入正确的路径tomcat会抛出异常:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].Sta
ndardContext[/reportExport]]
...
Caused by: java.lang.IllegalArgumentException: The main resource set specified [C:\Users\moritz\entwicklung\apache-tomca
t-8.0.18\webapps\reportExport] is not valid
...
11-Feb-2015 14:15:38.303 SEVERE [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor Error de
ploying configuration descriptor C:\Users\moritz\entwicklung\apache-tomcat-8.0.18\conf\Catalina\localhost\reportExport.x
ml
...
部署 webapp 后,启动就很好了。 第二个问题是reportExport.xml在取消部署网络应用程序时被删除。
所以我的设置有问题:我希望系统管理员为我的应用程序设置特定的数据源。我喜欢每个 web 应用程序有一个单独的文件的想法,但是第一次设置的异常和取消部署的删除是不好的。 另一方面,在 server.xml 中设置数据源可能很好,但是如何在其中配置“上下文”元素以使数据源仅适用于特定应用程序?
【问题讨论】:
【参考方案1】:好的, 最简单的方法: - 在 server.xml 中使用与您的 reportExport.xml 文件中相同的语法声明全局资源(几乎在顶部)。 如果您命名每个 DataSource 不同,例如 jdbc/reportExport 您的每个 Web 应用程序都可以使用不同的连接,您只需更新代码即可调用“自定义名称”。 因此,在 MET-INF/context.xml 文件中的 .war 中(在 web/META_INF/context.xml 中构建战争之前),您需要重新引用全局资源:
<ResourceLink global="jdbc/reportExport" name="jdbc/reportExport" type="javax.sql.DataSource"/>
然后从您的代码中正常访问它。
如果你愿意,你甚至可以在 context.xml 中将它重命名为 jdbc/mssql,这样你的 java 代码会像以前一样看到它,但它会指向正确的数据源。但我建议在每个应用程序中保留不同的名称,以便您直接看到您正在访问的内容(个人喜好)。
该解决方案的主要问题是另一个 Web 应用程序可以引用其 context.xml 中的任何全局资源并访问它们。但是,如果您负责代码/服务器,那应该没什么大不了的。
如果是,您无需手动将 .xml 文件放入 webapps 文件夹,而是将其内容添加到默认主机元素下的上下文描述中(一些位于 server.xml 的末尾)。 但是 tomcat 将始终寻找那里引用的应用程序(因此当您取消部署应用程序时会收到错误消息),如果您向元素添加新资源(变量不是全局数据源),则必须更新服务器端上下文描述再次。
因此,如果从安全的角度来看它并不重要,那么 GlobalResources 加上在 web-app 的 context.xml 中重新引用它们是最简单的方法。
【讨论】:
目前我的 web.xml 中有“resource-ref”,与 context.xml 中的 ResourceLink 相比,这有什么关系?由于 server.xml 中没有 Context 元素,我应该添加它还是只添加资源? 据我所知,您需要上下文元素中的资源链接,web.xml 中的资源链接用于文档目的(或者您没有被 java:comp/env 引用,因为它们不是环境)。但我可能错了,因为我没有玩太多。从一些可行的东西开始,然后你可以调整它。 a) 在全局资源中声明 DataSource,b) 在您的 war 文件中添加 context.xml,c) 在您的 context.xml 中描述资源链接。如果它有效,如果你不想在你的战争中喜欢上下文文件,将上下文描述移动到 server.xml 的主机元素(但你为什么不想要它???)以上是关于如何在tomcat 8中正确配置jndi数据源的主要内容,如果未能解决你的问题,请参考以下文章
如何为 tomcat 6 及其部署的 webapps 正确配置 JNDI?
如何使用 HikariCP 在 Jboss 中配置 JNDI 数据源?
springboot使用JNDI指定数据源配置由外部tomcat配置