2

開発にはHibernate3を使用し、ローカル開発サーバーとしてWASLibertyProfileを使用しています。DBサーバーがダウンしたときに例外処理を作成しようとしています。hibernate.cfg.xmlこれを行うために、このテストのために偽のIPアドレスに接続して環境をシミュレートしようとしています。

次のJAVAコードがありますが、DB接続の準備ができていないときに、例外コードで例外がキャッチされませんでした。コンソール出力は、接続を警告として取得できなかったことを示しています。シナリオを警告として表示するのではなく、例外コードでキャプチャする方法を教えてください。

JAVAコード

   public class HibernateUtil { 
     static {
       try {
         log.info("HibernateUtil.static - Begin");

         if (cacheFactory.get("Factory") == null) {
           sessionFactory = new Configuration().configure().buildSessionFactory();
           cacheFactory.put("Factory", sessionFactory);
         } else {
           sessionFactory = (SessionFactory) cacheFactory.get("Factory");
         }

         log.info("HibernateUtil.static - end");

       } catch (HibernateException ex) {
         throw new RuntimeException("[Exception] : " + ex.getMessage(), ex);
       }
     }

     ...
     ...
   }

コンソール出力

INFO  2012-09-20 15:24:16,314 [HibernateUtil.java:37] - HibernateUtil.static - Begin

[WARNING ] recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
[WARNING ] Property [hibernate.cglib.use_reflection_optimizer] has been renamed to [hibernate.bytecode.use_reflection_optimizer]; update your properties appropriately
[WARNING ] recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
[WARNING ] Property [hibernate.cglib.use_reflection_optimizer] has been renamed to [hibernate.bytecode.use_reflection_optimizer]; update your properties appropriately
[WARNING ] Could not obtain connection to query metadata

INFO  2012-09-20 15:24:24,001 [HibernateUtil.java:46] - HibernateUtil.static - end

Hibernate構成

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.url">jdbc:db2://192.168.1.6:51201/MYDB</property>
    <property name="hibernate.connection.username">myuser</property>
    <property name="hibernate.connection.password">MyPassword</property>

    <property name="hibernate.connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>
    <property name="hibernate.dialect">org.hibernate.dialect.DB2Dialect</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
    <property name="hibernate.jdbc.batch_size">100</property>
    <property name="hibernate.show_sql">false</property>

    <property name="hibernate.connection.release_mode">auto</property>
    <property name="current_session_context_class">thread</property>
    <property name="hibernate.connection.autocommit">true</property>
    <property name="hibernate.transaction.flush_before_completion">true</property>
    <property name="hibernate.transaction.auto_close_session">false</property>
    <property name="hibernate.cglib.use_reflection_optimizer">true</property>

    ...

    </session-factory>
</hibernate-configuration>
4

2 に答える 2

2

必要なのはtest-on-connection-acquire

デフォルトのHibernate接続プールを使用しているようです。残念ながら、Hibernate接続プールは彼のプロパティをサポートしておらず、C3P0のようなサードパーティの接続プールライブラリを推奨しています。

Hibernateの公式ドキュメントでは、デフォルトの接続を使用することをお勧めしません。

ただし、Hibernate独自の接続プールアルゴリズムは非常に初歩的なものです。これは、開始を支援することを目的としており、実動システムでの使用、またはパフォーマンステストでの使用を目的としたものではありません。最高のパフォーマンスと安定性を得るには、サードパーティのプールを使用する必要があります。

C3P0をHibernateで構成する方法は次のとおりです。接続をテストするためのC3P0の関連プロパティは次のとおりです。

于 2012-09-20T10:41:50.833 に答える
0

どのクラスが警告を生成していますか?私の推測では、例外がスローされていないため、例外をキャッチしていないと思います。その場合は、コードで接続が確立されているかどうかをテストし、自分で例外をスローすることができます。

于 2012-09-20T08:27:08.510 に答える