2009-07-22 96 views
5

我开发Java Web应用程序,我使用Tomcat连接池,这里是我的设置:可以同时使用Hibernate和Tomcat连接池吗?

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="" docBase="" debug="5" reloadable="true" crossContext="true"> 
<Resource name="jdbc/jdbcPool" 
      auth="Container" 
      type="javax.sql.DataSource" 
      maxActive="100" 
      maxIdle="30" 
      maxWait="10000" 
      username="root" 
      password="*******" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/dbname?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>    
</Context> 

和吾道:

public static Connection dbConnection() throws NamingException { 
     Context initContext; 
     DataSource ds = null; 
     Connection conn = null; 
     try { 
      initContext = new InitialContext(); 
      Context envContext = (Context) initContext.lookup("java:/comp/env"); 
      ds = (DataSource) envContext.lookup("jdbc/jdbcPool"); 
      conn = ds.getConnection();   
     }catch (SQLException ex){ 
      logger.error("SQLException Occurred in DAO.dbConnection() Method, Exception Message is: " + ex.getMessage(), ex); 
     } 
     catch (RuntimeException er){ 
      logger.fatal("SQLException Occurred in DAO.dbConnection() Method, Exception Message is: " + er.getMessage(), er); 
     }catch(Exception rt){ 
      logger.fatal("Exception Occurred in DAO.dbConnection() Method, Exception Message is: " + er.getMessage(), er); 
     } 
     return conn; 
    } 

我想用冬眠,所以我重构的某些部分我的代码,现在我想知道它是否可能在我的应用程序中使用它们(我的意思是我的代码的一部分使用休眠,某些部分使用我的DAO连接?) 如果是的话,那些表会发生什么那不是用hibernate映射的,但有些映射表与它们有关系?

回答

2

我个人的喜好与休眠是不配置连接池。

Connection conn = ... // get from jndi 
Session session = sessionFactory.openSession(connection); 
try{ 
    //do some work with either hte connection or the session or both 
}finally{ 
    session.close(); 
    conn.close(); 
} 

这样做的好处是你在控制它的正在使用的连接以及它是:这可以通过简单地在我们的Hibernate配置省略了连接池的设置和使用的openSession(连接)方法来实现分配,最重要的是它关闭的地方,如果使用hibernate和jdbc代码执行事务,这可能很重要。

编辑:关于@ChssPly76关于排除休眠内置事务管理的观点,他说的很对,hibernate提供合理的事务支持,并且给定的JTA将与任何正在进行的事务同步。在一个没有JTA的应用程序中,您需要hibernate和jdbc代码在同一个jdbc事务中运行,因此确保hibernate Session与jdbc代码使用相同的Connection很重要,最好的方法是给连接到会话工厂。注意这并不排除使用休眠事务对象:

Connection conn = ... // get from jndi 
Session session = sessionFactory.openSession(connection); 
try{ 
    Transaction tx = new Transaction(); // 
    //do some work with either hte connection or the session or both 
    tx.commit(); 
}finally{ 
    session.close(); 
    conn.close(); 
} 

它会工作得很好。

3

我想你可以一起使用它们,但你为什么?您可以配置Hibernate来使用您的数据源,如manual中所述。这将是这样的:

hibernate.connection.datasource = java:/comp/env/jdbc/jdbcPool 
hibernate.dialect = org.hibernate.dialect.MySQLDialect 

至于映射去,“映射”表可以有关系,“未映射”表(在数据库中),但这些关系也将是“未映射”(例如休眠赢得不了解他们)。所以,如果你这样做,你必须确保在尝试插入/更新“映射”实体时不会引起任何参照完整性问题。

+0

Tanx为你答案,我必须做一些测试,以了解究竟发生了什么。 – Am1rr3zA 2009-07-22 05:43:02

+0

这种方法在[本博客](http://workblognotes.blogspot.ca/2010/08/hibernate-and-tomcat-database.html)中有更详细的描述。 – Pixel 2012-06-21 20:18:33