【发布时间】:2014-01-12 01:49:25
【问题描述】:
我在同一台 Windows 机器上设置了两个运行在不同端口上的 tomcat 实例。一个用于 Alpha,另一个用于开发。我已经将 Alpha 和 Dev 战争(相同的应用程序名称,META-INF/context.xml 中的不同设置)部署到每个服务器。
Tomcat 目录具有完全相同的内容,除了:
- 部署的战争不同(我重新开始,删除了 webapps/* 战争文件和目录)
- conf/server.xml文件不同(设置不同的端口)
- bin/catalina.bat 文件不同(将 CATALINA_HOME 更改为每个实例的完整路径)
其余的都一样。
问题是每个战争的 META-INF/context.xml 文件指向不同的数据库,一个用于开发,一个用于 alpha。更具体地说连接URL不同,更具体地说只有数据库名称不同(斜杠和URL问号之间的字符串)。
但是,由于某种原因启动了两个实例后,它们都指向 Dev 数据库。也就是说,他们可能都在读取 Dev context.xml,并且可能是相同的 webapps/AppName 文件夹
这怎么可能?
当我启动 Dev tomcat 时,控制台显示 CATALINA_HOME、CATALINA_BASE、CATALINA_TMPDIR 和 CLASSPATH 的值,它们都显示了 Dev tomcat 目录的完整路径。
当我启动 Alpha tomcat 时,控制台也会显示这些变量的值,并且它们都显示到 Alpha tomcat 目录的完整路径(因此路径似乎没问题)。
我检查了部署的 alpha_tomcat_dir/webapps/AppName/META-INF/context.xml 文件,它确实显示了 alpha 数据库配置。
但在运行时它仍然使用Dev数据库的db信息。
我还应该去哪里看?
这些是 context.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/hng"
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
type="javax.sql.DataSource"
maxActive="60"
minIdle="5"
maxIdle="60"
maxWait="10000"
testOnBorrow="true"
testOnReturn="true"
testWhileIdle="true"
validationQuery="SELECT 1"
timeBetweenEvictionRunsMillis="20000"
minEvictableIdleTimeMillis="300000"
removeAbandoned="true"
removeAbandonedTimeout="180"
logAbandoned="true"
username="root"
password="<removed>"
url="jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true" />
</Context>
这些文件仅在数据库名称上有所不同。它是 dev 的“hngdev”和 alpha 的“hngalpha”(而不是 dbname)
【问题讨论】:
-
使用什么数据库服务器? mysql?
-
想与我们分享您的上下文文件吗?
-
这里有 config.xml 文件。我 100% 确定这只是 db 差异,我检查了 winmerge 中的差异,以防我的眼睛在跟我开玩笑。
-
等等!当我进行像 DataSource ds = (DataSource)(new InitialContext()).lookup("java:comp/env/jdbc/hng") 之类的查找时...我查找的资源是否跨多个进程共享?它是否有可能不尝试从我的 context.xml 构建连接池,因为该路径的一个资源已经存在于另一个 java 进程中?