【问题标题】:Spring MVC JNDI Connection pool errorSpring MVC JNDI连接池错误
【发布时间】:2014-04-09 19:34:52
【问题描述】:

我正在使用 Spring MVC JNDI,但出现此异常:

异常 javax.naming.NameNotFoundException:名称 jdbc 未绑定在此上下文中

我不知道如何解决这个问题。这是我的代码:

applicationContext.xml

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dbDataSource" ref="dbDataSource" />  
</beans>

<bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jdbc/practice"/>
  <property name="lookupOnStartup" value="true"></property>
</bean>

public class EmpDAOImpl implements EmpDAO {
  @Autowired
  private SessionFactory sessionfactory;

  @Autowired
  @Qualifier("dbDataSource")
  private DataSource dataSource;
}

web.xml

<web-app >
  <resource-ref>
    <description>MySQL Datasource example</description>
    <res-ref-name>java:comp/env/jdbc/practice</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

【问题讨论】:

标签: java spring jndi


【解决方案1】:

您并不是说 JNDI 资源是如何在您的容器中配置的(例如 Tomcat 中的 server.xmlMETA-INF/context.xml 或...)。但是&lt;res-ref-name&gt; 中的资源名称应该是jdbc/practicejndiName bean 属性的值也应该是。

这里有几点建议:

【讨论】:

    【解决方案2】:
     applicationContext.xml
     <bean id="sessionFactory"                                                                                                     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dbDataSource" ref="dbDataSource" />  
      </bean>
     <bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/practice"/>
         <property name="lookupOnStartup" value="true"></property>
      </bean>
    
     web.xml
      <resource-ref>
    <description>MySQL Datasource example</description>
    <res-ref-name>java:comp/env/jdbc/practice</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
     </resource-ref>
    

    公共类 EmpDAOImpl 实现 EmpDAO{

    @Autowired
    private SessionFactory sessionfactory;
    
        @Autowired
         @Qualifier("dbDataSource")
        private DataSource dataSource;
    

    public void addEmp(Employee e) {

        this.sessionfactory.getCurrentSession().save(e);
    
         }
          }
    
       server.xml
      <server>
      <GlobalNamingResources>
      <Resource name="jdbc/practice"
      global="jdbc/practice"
      auth="Container"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/practice"
      username="root"
      password="root123"
      maxActive="100"
      maxIdle="20"
      minIdle="5"
      maxWait="10000"/>
      </GlobalNamingResources>
        </server>
    

    【讨论】:

      【解决方案3】:

      context.xml

         <context>
          <ResourceLink name="jdbc/practice"
                      global="jdbc/practice"
                      auth="Container"
                      type="javax.sql.DataSource" />
          </context>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 2014-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        • 1970-01-01
        相关资源
        最近更新 更多