Jetty - 不同上下文和数据库的连接池,但相同的查找代码
Jetty - connection pool for different contexts and database, but same lookup code
我正在尝试使用 .xml 上下文描述符为 2 个独立的上下文路径和数据库配置连接池 2 Web 应用程序,但逻辑代码相同。
问题是,当使用 JNDI 查找数据源时,jetty 加载上下文时资源被覆盖,应用程序最终使用相同的数据库。这是我的配置和代码:
MyApp1.xml 的配置:
<New id="myDataBase" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/myDataBase</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://host:3306/mydb</Set>
<Set name="User">...</Set>
<Set name="Password">...</Set>
</New>
</Arg>
</New>
MyApp2.xml
的配置
<New id="myDataBase" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/myDataBase</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://host:3306/mydb-test2</Set>
<Set name="User">...</Set>
<Set name="Password">...</Set>
</New>
</Arg>
</New>
应用程序使用的代码:
public class MyDb {
...
static {
try {
datasource = (DataSource) new InitialContext().lookup("jdbc/myDataBase");
} catch (NamingException e) {
// ...
}
...
}
因此,jetty 加载 MyApp1.xml 的上下文,然后 MyApp2.xml。当我尝试访问这些应用程序时,它们都使用相同的数据库:mydb-test2.
如何正确解决这个问题?
编辑:
我试过在配置中添加参数,但它不起作用;奇怪的是现在上下文都使用第一个配置的数据库:mydb
这是每个应用的 xml:
<Configure id='wac1' class="org.eclipse.jetty.webapp.WebAppContext">
...
<New id="myDataBase" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg><Ref refid='wac1'/></Arg>
<Arg>jdbc/myDataBase</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://host:3306/mydb</Set>
<Set name="User">...</Set>
<Set name="Password">...</Set>
</New>
</Arg>
</New>
...
<Configure id='wac2' class="org.eclipse.jetty.webapp.WebAppContext">
...
<New id="myDataBase" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg><Ref refid='wac2'/></Arg>
<Arg>jdbc/myDataBase</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://host:3306/mydb-test2</Set>
<Set name="User">...</Set>
<Set name="Password">...</Set>
</New>
</Arg>
</New>
...
我错过了什么?我是否必须更改代码(我进行查找的方式)?
我试过了
datasource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/myDataBase");
但我得到一个 javax.naming.NameNotFoundException - 可能是因为我不使用环境变量,但我认为我不需要它,只是根据上下文范围查找)
编辑 2:
好的,所以我实际上缺少解决问题的 web.xml 配置(参见 http://www.eclipse.org/jetty/documentation/current/jndi-configuration.html#configuring-datasources)
<resource-ref>
<res-ref-name>jdbc/HugaDataBase</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
您需要为 JNDI 条目设置 scope。而不是空的第一个参数,你应该有这样的东西:<Arg><Ref refid='myapp'/></Arg>
我正在尝试使用 .xml 上下文描述符为 2 个独立的上下文路径和数据库配置连接池 2 Web 应用程序,但逻辑代码相同。 问题是,当使用 JNDI 查找数据源时,jetty 加载上下文时资源被覆盖,应用程序最终使用相同的数据库。这是我的配置和代码:
MyApp1.xml 的配置:
<New id="myDataBase" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/myDataBase</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://host:3306/mydb</Set>
<Set name="User">...</Set>
<Set name="Password">...</Set>
</New>
</Arg>
</New>
MyApp2.xml
的配置 <New id="myDataBase" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/myDataBase</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://host:3306/mydb-test2</Set>
<Set name="User">...</Set>
<Set name="Password">...</Set>
</New>
</Arg>
</New>
应用程序使用的代码:
public class MyDb {
...
static {
try {
datasource = (DataSource) new InitialContext().lookup("jdbc/myDataBase");
} catch (NamingException e) {
// ...
}
...
}
因此,jetty 加载 MyApp1.xml 的上下文,然后 MyApp2.xml。当我尝试访问这些应用程序时,它们都使用相同的数据库:mydb-test2.
如何正确解决这个问题?
编辑:
我试过在配置中添加参数,但它不起作用;奇怪的是现在上下文都使用第一个配置的数据库:mydb
这是每个应用的 xml:
<Configure id='wac1' class="org.eclipse.jetty.webapp.WebAppContext">
...
<New id="myDataBase" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg><Ref refid='wac1'/></Arg>
<Arg>jdbc/myDataBase</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://host:3306/mydb</Set>
<Set name="User">...</Set>
<Set name="Password">...</Set>
</New>
</Arg>
</New>
...
<Configure id='wac2' class="org.eclipse.jetty.webapp.WebAppContext">
...
<New id="myDataBase" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg><Ref refid='wac2'/></Arg>
<Arg>jdbc/myDataBase</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://host:3306/mydb-test2</Set>
<Set name="User">...</Set>
<Set name="Password">...</Set>
</New>
</Arg>
</New>
...
我错过了什么?我是否必须更改代码(我进行查找的方式)?
我试过了
datasource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/myDataBase");
但我得到一个 javax.naming.NameNotFoundException - 可能是因为我不使用环境变量,但我认为我不需要它,只是根据上下文范围查找)
编辑 2:
好的,所以我实际上缺少解决问题的 web.xml 配置(参见 http://www.eclipse.org/jetty/documentation/current/jndi-configuration.html#configuring-datasources)
<resource-ref>
<res-ref-name>jdbc/HugaDataBase</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
您需要为 JNDI 条目设置 scope。而不是空的第一个参数,你应该有这样的东西:<Arg><Ref refid='myapp'/></Arg>