tomcat8中如何正确配置jndi数据源

how to correctly configure jndi data source in tomcat 8

我尝试在

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

好的, 最简单的方法: - 在 server.xml 中使用与 reportExport.xml 文件中相同的语法声明全局资源(几乎在顶部)。 如果您命名每个数据源不同,例如 jdbc/reportExport 您的每个网络应用程序都可以使用不同的连接,您只需更新代码即可调用 'customized name'。 所以在 MET-INF/context.xml 文件中的 .war (在 web/META_INF/context.xml 中构建 war 之前)你需要引用全球资源:

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

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

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

该解决方案的主要问题是另一个网络应用程序可以引用其 context.xml 中的任何全局资源并访问它们。但是,如果您是 code/server 的负责人,那应该没什么大不了的。

如果是,您无需手动将 .xml 文件放入 webapps 文件夹中,而是将其内容添加到默认宿主元素下的上下文描述中(有些位于 server.xml ). 但是 tomcat 将始终寻找在那里引用的应用程序(因此当您取消部署应用程序时您会收到错误消息),如果您向元素添加新资源(变量而不是全局数据源),您的服务器端上下文描述也会又要更新了

因此,如果从安全角度来看它不是至关重要的,那么 GlobalResources 加上在您的网络应用程序的 context.xml 中重新引用它们是最简单的方法。