有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不同上下文和数据库的java Jetty连接池,但查找代码相同

我正在尝试使用配置连接池2 web应用程序。xml上下文描述符,用于两个独立的上下文路径和数据库,但具有相同的逻辑代码。 问题是,当使用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。命名。NameNotFoundException——可能是因为我不使用env变量,但我认为我不需要它,只需要按上下文范围查找)

编辑2:

好吧,我真的错过了一个网页。解决该问题的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>

共 (1) 个答案

  1. # 1 楼答案

    您需要为JNDI条目设置scope。第一个参数不是空的,而是如下所示:<Arg><Ref refid='myapp'/></Arg>