2009-07-22 5 views
5

私は、Java Webアプリケーションを開発していますし、私はここで、Tomcatの接続プールを使用し、私の設定です:私は冬眠使いたいは同時にHibernateとTomcat Connectionプールを使用できますか?

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; 
    } 

ので、私はいくつかの部分をリファクタリング:

<?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> 

と私のDAO私のコードは、今私が知りたいのは私が私のアプリケーションでそれらの両方を使うことができるということです(私のコードの一部は休止状態を使用し、一部は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コードを使用してトランザクションを実行している場合は、これが重要になる可能性があります。

EDIT:on @ ChssPly76ポイントは、休止状態の組み込みトランザクション管理を除外しています。彼はかなり正しいです.Hibernateは、合理的なトランザクションサポートを提供し、所定のJTAが進行中のトランザクションと同期するかどうかを示します。同じjdbcトランザクションで動作するためにhibernateとjdbcコードの両方を必要とするnone JTAアプリケーションでは、hibernate Sessionがjdbcコードと同じConnectionを使用していることを確認することが重要です。これを行う最善の方法は、セッションファクトリへの接続。これは、Hibernateトランザクションオブジェクトの使用を除外しないことに注意してください。

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(); 
} 

これはうまく動作します。

+0

私はcontext.xmlで自分のJNDI設定を省略し、Quering DB(休止状態を使用したくない)を望むときに、休止状態のsessionFactoryから接続を取得することを意味しますか?共通のJDBC接続のように動作しますか? – Am1rr3zA

+0

@gid理由を詳しく説明できますか? Hibernateは独自のトランスレーション管理を提供しています(つまり、JTAを使用しています)ので、接続が閉じられたとき、あるいはプールに戻ったときにどうして気になりますか?あなたが手動でHibernateがあなたのためにやることの多くをやっているようなものです。何か不足していますか? – ChssPly76

+0

私は、接続設定(つまり、JNDIリファレンスや、ハイバネート設定からの接続への他の参照) –

3

私はそれらを一緒に使うことができると思いますが、なぜでしょうか? manualのようにデータソースを使用するようにHibernateを設定することができます。例えば休止ウォン(限りマッピングが行くように、「マッピング」テーブルが(データベース内)「マップされていない」テーブルに関係を持つことができますが、それらの関係はまた、「マップされていない」となります

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

:それはようなものになるだろう彼らに気づかないでください)。したがって、もしあなたがそのようにすれば、 "マッピングされた"エンティティを挿入/更新しようとしているときに、参照整合性の問題を引き起こさないようにする必要があります。

+0

あなたの答えは、私は正確に何が起こるかを理解するためにいくつかのテストを行う必要があります。 – Am1rr3zA

+0

このアプローチについては、[this blog](http://workblognotes.blogspot.ca/2010/08/hibernate-and-tomcat-database.html)で詳しく説明しています。 – Pixel