【发布时间】:2014-09-17 06:19:54
【问题描述】:
我有两台 Tomcat 服务器在一台机器上作为 Windows 服务运行,每台都安装在不同的 HD 中并使用不同的端口。 每个 Tomcat 都在其 context.xml 中对 JDBC 驱动程序进行数据源引用(两个连接都指向同一个 MySql 服务器,但不同的 DB):
Tomcat1:
<Resource name="jdbc/monitor" auth="Container" type="javax.sql.DataSource" maxActive="100"
maxIdle="30" maxWait="10000" username="user" password="password"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/monitor
autoReconnect=true&useEncoding=true&characterEncoding=UTF-8/>"
Tomcat2
<Resource name="jdbc/monitor" auth="Container" type="javax.sql.DataSource" maxActive="100"
maxIdle="30" maxWait="10000" username="user" password="password"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/monitorbeta
autoReconnect=true&useEncoding=true&characterEncoding=UTF-8/>"
在代码中调用 Initial context(在两台服务器上的所有 servlet 中)是以非常标准的方式进行的:
InitialContext context = new InitialContext();
DataSource datasource = (DataSource) context.lookup("java:/comp/env/jdbc/monitor");
Connection connection = datasource.getConnection();
return connection;
问题是在 Tomcat2 上,其中一个 servlet 从 Tomcat1 context.xml 获取连接(因此更新了错误的表)——而其他 servlet 则“进入”正确的上下文!! 我重新启动了服务,确保 Tomcat 使用其他端口,并且 catalina home/base 在 Tomcat2 上正确设置。我错过了什么?
编辑: 另外,我试图像这样手动将环境设置为 InitialContext:
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.rmi.registry.RegistryContextFactory");
env.put(Context.PROVIDER_URL,"rmi://localhost:9080");
Context ctx = new InitialContext(env);
还是没有成功
【问题讨论】:
-
您是否已将 Tomcat2 Initialcontext 配置为在新端口号处查找命名提供程序?否则它将使用默认端口号,这是在 Tomcat1 上运行的端口号。您可以通过
java.naming.provider.url属性进行设置。 -
@AlexanderLanger 你的意思是添加 -d java.naming.provider.url = //localhost:XXXX 到 java 选项吗?
-
不,您可以将这些选项传递给您的
InitialContext,例如docs.oracle.com/javase/7/docs/api/javax/naming/… -
@AlexanderLanger 看看我的编辑,仍然指向错误的上下文
-
9080端口看起来很陌生,默认端口是1099;当然,对于 tomcat2 实例,您必须指定您在 tomcat2 服务器配置中所做的端口号,该端口号必须与 tomcat1 端口号不同。你试过了吗?
标签: java tomcat jakarta-ee servlets