【问题标题】:Defining two data sources in jetty (jetty-env.xml)在 jetty (jetty-env.xml) 中定义两个数据源
【发布时间】:2012-07-04 22:53:40
【问题描述】:

我正在尝试使用jetty-env.xml 文件在我的Web 应用程序中定义两个数据源。 它只适用于一个数据源,但是添加第二个数据源时出现此异常:

java.lang.IllegalStateException: Nothing to bind for name javax.sql.DataSource/default

这是我的配置:

jetty-env.xml

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="ds" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg>jdbc/mybd1</Arg>
        <Arg>
            <New class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <Set name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</Set>
                 <Set name="jdbcUrl">jdbc:jtds:sqlserver://url:1433/mybd1</Set>
                 <Set name="user">xx</Set>
                 <Set name="password">yy</Set>
            </New>
        </Arg>
    </New>

    <New id="ds2" class="org.eclipse.jetty.plus.jndi.Resource" >
        <Arg>jdbc/mybd2</Arg>
        <Arg>
            <New class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <Set name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</Set>
                <Set name="jdbcUrl">jdbc:jtds:sqlserver://url:1433/mybd2</Set>
                <Set name="user">xx</Set>
                <Set name="password">yy</Set>
            </New>
        </Arg>
    </New>
</Configure> 

web.xml

<resource-ref>
    <res-ref-name>jdbc/mybd1</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <res-ref-name>jdbc/mybd2</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

hibernate.cfg.xml(还有另外一个hibernate.cfb.xml来配置第二个数据源)

<session-factory>
  <property name="connection.datasource">jdbc/mybd1</property>
  <!-- ... -->

有什么线索吗?

【问题讨论】:

    标签: java jetty datasource


    【解决方案1】:

    我没有机会对其进行测试,但在我看来,您的问题是您缺少适用于范围的 &lt;Arg /&gt;

    您的 DS 应该是:

        <New id="ds" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>jdbc/mybd1</Arg>
        <Arg>
            <New class="com.mchange.v2.c3p0.ComboPooledDataSource">
    

    等等

    第一个“Arg”是作用域,没有它,你的其他论点就不合适了,可能会导致你的问题。

    【讨论】:

    • 我遇到了类似的问题,这对我有用。但是现在我又遇到了一个问题……
    • 呵呵呵呵... 看过 jndi.Resource 的构造吗? Resource (Object scope, String jndiName, Object objToBind) Resource (String jndiName, Object objToBind)...所以你可以同样使用三个带值的参数,空的第一个参数范围和其他两个参数或只有两个参数
    【解决方案2】:

    尝试在 Jetty 中启用登录。 注意记录器名称是“jndi”。 Jetty 开发人员不使用 class-name 作为 JNDI 的 logger-name。

    我花了 2 天时间找出 web.xml 和 jetty-env.xml 中定义的名称之间的区别。

    【讨论】:

      【解决方案3】:

      jetty-env.xml 和 web.xml 中的 id 参数值应该匹配

      jetty-env.xml

      <Configure class="org.eclipse.jetty.webapp.WebAppContext">
          <New id="DS1" class="org.eclipse.jetty.plus.jndi.Resource">...</New>
          <New id="DS2" class="org.eclipse.jetty.plus.jndi.Resource">...</New>
      </Configure> 
      

      web.xml

      <resource-ref id="DS1">...</resource-ref>
      <resource-ref id="DS2">...</resource-ref>
      

      【讨论】:

      • 这似乎是一个很好的答案.. 但多年来我没有参与这个问题:P 我无法测试它
      【解决方案4】:

      看看: https://www.eclipse.org/jetty/documentation/9.4.x/using-jetty-jndi.html

      决定在哪里声明资源 您可以在三个地方定义命名资源:

      jetty.xml jetty.xml 文件中定义的命名资源的范围是 JVM 级别或服务器级别。 资源的类必须在 Jetty 容器级别可见。如果资源的类只存在于您的 webapp 中,则必须在 WEB-INF/jetty-env.xml 文件中声明它。

      WEB-INF/jetty-env.xml WEB-INF/jetty-env.xml 文件中的命名资源的范围是文件所在的 Web 应用程序。虽然您可以选择输入 JVM 或服务器范围,但我们不建议这样做。此处定义的资源可以使用 webapp 内部的类。这是 Jetty 特有的机制。

      上下文 xml 文件 上下文 xml 文件中的条目应在它们所应用的 webapp 级别范围内,但如果您选择,您可以提供不太严格的服务器或 JVM 范围级别。与在 jetty.xml 文件中声明的资源一样,与资源关联的类必须在容器的类路径中可见。

      然后放一个这样的文件:

           <?xml version="1.0"?>
       <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
      
       <Configure class="org.eclipse.jetty.webapp.WebAppContext">
      
         <!-- Add an EnvEntry only valid for this webapp               -->
         <New id="gargle"  class="org.eclipse.jetty.plus.jndi.EnvEntry">
           <Arg>gargle</Arg>
           <Arg type="java.lang.Double">100</Arg>
           <Arg type="boolean">true</Arg>
         </New>
      
        <!-- Add an override for a global EnvEntry                           -->
         <New id="wiggle"  class="org.eclipse.jetty.plus.jndi.EnvEntry">
           <Arg>wiggle</Arg>
           <Arg type="java.lang.Double">55.0</Arg>
           <Arg type="boolean">true</Arg>
         </New>
      
         <!-- an XADataSource                                                -->
         <New id="mydatasource99" class="org.eclipse.jetty.plus.jndi.Resource">
           <Arg>jdbc/mydatasource99</Arg>
           <Arg>
             <New class="com.atomikos.jdbc.SimpleDataSourceBean">
               <Set name="xaDataSourceClassName">org.apache.derby.jdbc.EmbeddedXADataSource</Set>
               <Set name="xaDataSourceProperties">databaseName=testdb99;createDatabase=create</Set>
               <Set name="UniqueResourceName">mydatasource99</Set>
             </New>
           </Arg>
         </New>
      
       </Configure>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 2014-03-14
        相关资源
        最近更新 更多