2016-09-19 7 views
-1

私は休止状態を使用していますが、パフォーマンスに問題があります。
ローカルデータベースで使用すると非常に高速ですが、リモートデータベース(およびリモートデータベースではローカルネットワーク)で非常に遅いです!
なぜですか?
リモートデータベース(PostgreSQL)でHibernateが非常に遅い

私はあなたが多分それは遅延読み込みの問題だと言うだろうが、私は、単純な(子供なし)1つのエンティティの選択が、それでも遅い上でそれをテストしている、これをチェック知っている:

public List<Employee> read() { 
     List<Employee> objects = null; 
     Transaction tx = null; 
     try { 
      tx = HibernateUtil.SESSION.beginTransaction(); 
      Long start = System.currentTimeMillis(); 
      objects = HibernateUtil.SESSION.createQuery("FROM Employee AS T ORDER BY T.id DESC").list(); 
      Long stop = System.currentTimeMillis(); 
      System.out.println("Time: " + (stop - start) + "ms."); 
      tx.commit(); 
     } catch (HibernateException e) { 
      if (tx != null) 
       tx.rollback(); 
      e.printStackTrace(); 
     } 
     return objects; 
    } 

することができますように簡単な選択クエリを参照してください、これは私が得る結果である:ローカル

:リモート31MS
:356ms !!!!

そして、これは私の設定ファイルである:あなたがこれを説明することができます

<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
     <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> 
     <property name="hibernate.connection.username">postgres</property> 
     <property name="hibernate.connection.password">root</property> 
     <property name="hibernate.connection.url">jdbc:postgresql://192.168.1.3:5432/my_database</property> 
     <property name="connection_pool_size">1</property> 
     <property name="hbm2ddl.auto">update</property> 
     <property name="show_sql">false</property> 
     <property name="hibernate.enable_lazy_load_no_trans">true</property> 


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

+0

これはネットワーク遅延であり、データベースサーバーへのpingを見ている可能性があります。 – dbf

+0

8〜4 msの間で高速です – SlimenTN

+0

show_sqlをtrueにして特定の操作のSQLをダンプし、クライアントツールを使用して同じクエリ(読み取り専用クエリ)を実行しようとすると、ネットワークに関連する問題かどうかを確認できます。プロファイラを有効にしたJPA/JDBC(例:JProfiler)を使用してアプリケーションをプロファイリングする直接的な方法です。ターゲットのdbサーバがVM(ex VMware)内で実行されている場合、これはそのVM設定で問題になる可能性があります。 – hunter

答えて

0

あなたがたっプールに

理由設定が必要です。

よろしく:たとえばThe anatomy of Connection Pooling

を、あなたは、PostgreSQLとC3P0を使用することができます

+1

あなたの答えをありがとう、これはあなたに良いデータベース接続の経験を与えることを学ぶために非常に便利です接続プールについての詳細を学ぶための扉だった。これは問題の半分(そして最も重要なもの)を解決し、後半はクエリを最適化することです。 Thnx again :) – SlimenTN