【发布时间】:2014-04-18 00:54:17
【问题描述】:
我正在 Eclipse 中开发 Java Web 应用程序并部署到由 Eclipse 运行的 Tomcat 实例。我试图让这个应用程序通过 JNDI Resource 元素与另一台主机上的数据库通信。
应用程序中包含的 context.xml 文件尝试连接到在 localhost 上运行的 MySQL 服务器,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Environment name="log4j.configuration"
value="/path/to/installed/log4j.properties"
type="java.lang.String" />
<Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource"
username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/dbname" maxActive="8"
validationQuery="SELECT 1" testOnBorrow="true" />
<Environment name="mykey" value="installed" type="java.lang.String" />
</Context>
当我将它安装在实际主机上时,此配置有效。即正确读取环境值并连接到数据库。
我也可以将它安装在单独的主机上并编辑 /etc/tomcat6/conf/Catalina/localhost/myaplication.xml 以更改 JDBC URL,如下所示:
...
<Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource"
username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://otherhost:3306/dbname" maxActive="8"
validationQuery="SELECT 1" testOnBorrow="true" />
...
此配置也有效。换句话说,我非常有信心我的应用程序正确地使用了 JNDI。
所以,现在我想在 Eclipse 中将它部署到我桌面上的 Tomcat。我已经以标准方式将项目添加到 Tomcat,并且我已经编辑了服务器的 context.xml 文件(即 Eclipse 在“服务器”项目中我的 Tomcat 服务器下显示的文件),如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Environment name="log4j.configuration"
value=C:\workspace\myapplication\src\main\resources\conf\log_to_tomcat_console_log4j.properties"
type="java.lang.String" />
<Resource name="jdbc/configDB" auth="Container" type="javax.sql.DataSource"
username="dbuser" password="dbpassword" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://otherhost:3306/dbname" maxActive="8"
validationQuery="SELECT 1" testOnBorrow="true" />
<Environment name="mykey" value="desktop" type="java.lang.String" />
</Context>
当我在 Eclipse 中重新启动 Tomcat 时,日志显示 Log4J 文件的路径被正确读取(因为它开始记录到 Tomcat 控制台),我什至看到它吐出了正确的“mykey”值。但是,当它尝试从configDB 读取时,初始化失败。
起初,我认为这是连接问题,但排除后,我在调试器中重新启动了 Tomcat,并检查了从 JNDI 读取的 DataSource;它的 URL 指向 localhost,这意味着它使用的是应用程序的 context.xml 文件中的那个,而不是 Tomcat 的!
我已经尝试了几种方法来使其正常工作,包括将此信息放入 Tomcat 的 server.xml 文件中,但似乎没有任何效果。或者,更准确地说,它有点工作,因为它读取的是环境值而不是资源。
我在这里做错了什么?如何让 Eclipse 的 Tomcat 服务器覆盖此资源?
【问题讨论】:
-
这是一个精心设计的第一个问题。
-
谢谢!长期聆听者,第一次来电者。
-
您在 Eclipse 中使用的是什么版本的 Tomcat?具体是 6.0.x 还是 7.0.x?两者在这方面的行为是不同的。
-
我使用的是 6.0 版。