Tomcat 6、Hibernate 上的 JNDI 数据源问题

Tomcat 6、Hibernate 上的 JNDI 数据源问题

我使用 Tomcat 6 作为应用程序服务器、Struts-Hibernate 和 MyEclipse 6.0。

我的应用程序使用 JDBC 驱动程序,但我应该对其进行修改以使用 JNDI 数据源。我按照 tomcat 6.0 howto 教程中描述的步骤进行操作。

我在 tomcat>conf 中定义了我的资源:

    <Resource name="jdbc/ats" global="jdbc/ats" auth="Container"
          type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:@//localhost:1521/MISDEV"
          username="TEST" password="TEST" maxActive="20" maxIdle="10"
          maxWait="-1" validationQuery="SELECT 1 from dual" 
  removeAbandoned="true" 
          removeAbandonedTimeout="30" 
  logAbandoned="false"/>

我在我的应用程序 web.xml 中给出了参考:

 <resource-ref>
   <description>Oracle Datasource example</description>
   <res-ref-name>jdbc/ats</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
 </resource-ref>

我在 hibernate-cfg.xml 中定义了 datasource-dialect

 <property name="connection.datasource">java:comp/env/jdbc/ats</property>
 <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>

但是当我创建休眠会话时,它无法打开连接:

09:18:11,322 错误 JDBCExceptionReporter:72 - 无法从底层数据库获取连接!org.hibernate.exception.GenericJDBCException:无法打开连接

我还尝试在运行时设置属性:

        Configuration configuration = new Configuration();        
    configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle9Dialect");        
    //configuration.setProperty("hibernate.connection.datasource",  "java:comp/env/jdbc/ats");
    configuration.setProperty("hibernate.current_session_context_class", "thread");    
    configuration.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
    configuration.setProperty("hibernate.show_sql", "true");         


    sessionFactory = configuration.configure().buildSessionFactory();

它不会再次打开连接。

但是,当我使用 JDBC 驱动程序时,它可以工作:

Configuration configuration = new Configuration();        
    configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle9Dialect");        
    //configuration.setProperty("hibernate.connection.datasource",  "java:comp/env/jdbc/ats");
    configuration.setProperty("hibernate.connection.url", "jdbc:oracle:thin:@//localhost:1521/MISDEV");        
    configuration.setProperty("hibernate.connection.username", "test");        
    configuration.setProperty("hibernate.connection.password", "test");        
    configuration.setProperty("hibernate.connection.driver_class", "oracle.jdbc.OracleDriver");        
    configuration.setProperty("hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory");        
    configuration.setProperty("hibernate.current_session_context_class", "thread");    
    configuration.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");    
    configuration.setProperty("hibernate.show_sql", "true");         


    sessionFactory = configuration.configure().buildSessionFactory(); 

我已经搜索了 3 天,但一无所获。问题可能出在哪里?

答案1

我也遇到了同样的问题,但找到了一些链接。请看一下。两天后我会尝试亲自动手,然后告诉您结果。 https://forum.hibernate.org/viewtopic.php?f=1&t=1003866&start=15

在链接中他提到了一点

由于 tomcat 的 JNDI 是只读的,因此只有 Tomcat 本身才有权将对象绑定到 JNDI。因此对于 Hibernate 来说,在 Context.xml 中将数据源声明为 Resource 是不够的。您还必须按照链接文章中的说明在 Context.xml 中将 UserTransaction 声明为 Resource,因为使用 JTA 的 Hibernate 需要 UserTransaction 已绑定在 JNDI 上。以及链接

请尝试一下。

相关内容