2009-07-22 57 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