如何在tomcat 8中正确配置jndi数据源

时间:2015-02-11 13:25:03

标签: java tomcat jdbc jndi

我尝试在

中为我的应用配置jsbc数据源
  

-tomcat_home- \ CONF \卡塔利娜\本地主机

我的应用是“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中设置数据源可能会很好,但如何在那里配置“context”元素以使数据源仅适用于特定应用程序?

1 个答案:

答案 0 :(得分:7)

行, 最简单的方法: - 在server.xml中使用与reportExport.xml文件中相同的语法声明全局资源(几乎在顶部)。 如果将每个DataSource命名为differenlty,例如jdbc / reportExport 您的每个Web应用程序都可以使用不同的连接,您只需更新代码即可调用“自定义名称”。 因此,在MET-INF / context.xml文件中(在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中重新引用它们是最简单的方法。