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

我尝试在我的应用程序中配置jsbc数据源

-tomcat_home- \的conf \卡塔利娜\本地主机

我的应用程序是“reportExport”.war所以我用这个内容创建了reportExport.xml:

   

我在web.xml中添加了这个:

   This app requires a ms sql connection.   jdbc/mssql   javax.sql.DataSource   Container   

可能我可以省略我在reportExport.xml中给出的字段?!

在Java中我尝试获得这样的连接:

 ((DataSource) (new InitialContext()).lookup("java:comp/env/jdbc/mssql")).getConnection() 

连接在java中工作,但有2个问题。

第一个问题是:如果我在部署应用程序之前将reportExport.xml放入正确的路径tomcat抛出exception:

  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后,开始很好。 第二个问题是在取消部署Web应用程序时正在删除reportExport.xml。

所以我的设置出了问题:我希望系统管理员设置特定于我的应用程序的数据源。 我喜欢每个Web应用程序使用单独文件的想法,但首次设置时的例外和取消部署时的删除都很糟糕。 另一方面,在server.xml中设置数据源可能会很好,但是如何在那里配置“context”元素以使数据源仅适用于特定应用程序?

好的,最简单的方法: – 在server.xml中使用与reportExport.xml文件中相同的语法声明全局资源(几乎在顶部)。 如果您将每个DataSource命名为differenlty,例如jdbc / reportExport,则每个Web应用程序都可以使用不同的连接,您只需更新代码即可调用“自定义名称”。 因此,在MET-INF / context.xml文件中(在web / META_INF / context.xml中构建war之前),你需要引用全局资源:

  

然后从您的代码正常访问它。

如果你愿意,你甚至可以在context.xml中将它重命名为jdbc / mssql,这样你的java代码就会像以前一样看到它,但它会指向正确的数据源。 但我建议在每个应用程序中保留不同的名称,以便您直接看到您正在访问的内容(个人品味)。

该解决方案的主要问题是另一个Web应用程序可以引用其context.xml中的任何全局资源并访问它们。 但是,如果你负责代码/服务器,它应该不是什么大问题。

如果是,则不要手动将.xml文件放在webapps文件夹中,而是将其内容添加到默认主机元素下的上下文描述中(某些位于server.xml的末尾)。 但是tomcat总是会在那里查找引用的应用程序(因此在取消部署应用程序时会收到错误消息),如果向元素添加新资源(变量不是全局数据源),则必须更新服务器端上下文描述再次。

因此,如果从安全角度来看并不重要,那么GlobalResources以及在web-app的context.xml中重新引用它们是最简单的方法。