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 中重新引用它们是最简单的方法。
我尝试在
内为我的应用程序配置一个 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 中重新引用它们是最简单的方法。