65

この問題のデバッグに非常に苦労しています。postgresとの接続を確立しようとすると、1分かかります。接続が確立された後、すべてが正常です。すべてのマッピングを無効にしてロードしないようにしましたが、接続を取得するのに長い時間がかかります。検証を無効にしてみましたが、違いはありません。単純な単純なJDBC接続を使用すると、それは瞬時に行われます。Hibernateはかなりの時間がかかることをしているので、それを絞り込むことができないようです。どんな入力でも大歓迎です!

Postgresドライバー:

postgresql-9.1-901.jdbc4.jar

構成設定:

<hibernate-configuration>
    <session-factory>
    <!-- properties -->
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="connection.driver_class">org.postgresql.Driver</property>

        <property name="connection.url">jdbc:postgresql://xxxx.com:5432/xxxxx</property>
        <property name="connection.username">xxxxxxx</property>
        <property name="connection.password">xxxxxxx</property>

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

コードの追加設定:

    config.setProperty("hibernate.hbm2ddl.auto", hbm2ddlMode);
    //config.setProperty("hibernate.cache.use_query_cache", "true");
    config.setProperty("hibernate.cache.use_second_level_cache", "true");
    //config.setProperty("hibernate.cache.region.factory_class", "net.sf.ehcache.hibernate.EhCacheRegionFactory");
    config.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
    //config.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider");
    config.setProperty("hibernate.jdbc.fetch_size", "100");
    config.setProperty("hibernate.jdbc.batch_size", "30");
    config.setProperty("hibernate.jdbc.use_scrollable_resultset", "true");
    config.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");

    config.setProperty("hibernate.c3p0.acquire_increment", "1");
    config.setProperty("hibernate.c3p0.idle_test_period", "0");
    config.setProperty("hibernate.c3p0.min_size", "1");
    config.setProperty("hibernate.c3p0.max_size", "2");
    config.setProperty("hibernate.c3p0.timeout", "0");
    config.setProperty("javax.persistence.validation.mode", "none");

遅延が発生するコードのセグメントは次のとおりです。

private SessionFactory buildSessionFactory() throws Exception {
        ServiceRegistry serviceRegistry  = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();

            //Building session takes a whole minute without mappings!!!
        sessionFactory = config.buildSessionFactory(serviceRegistry);

        validateConnection();

        return sessionFactory;
    }

ログの結果は次のとおりです。

[main] 2012-04-09 10:40:32,823 110391 INFO  C3P0ConnectionProvider - HHH000046: 
Connection properties: {user=hgaidb_test, password=****}
[main] 2012-04-09 10:40:32,823 110391 INFO  C3P0ConnectionProvider - HHH000006: 
Autocommit mode: false
[main] 2012-04-09 10:40:34,100 111668 DEBUG JdbcServicesImpl - Database ->
       name : PostgreSQL
    version : 8.3.3
      major : 8
      minor : 3
[main] 2012-04-09 10:40:34,101 111669 DEBUG JdbcServicesImpl - Driver ->
       name : PostgreSQL Native Driver
    version : PostgreSQL 9.1 JDBC4 (build 901)
      major : 9
      minor : 1
*******************************************************************************
// 1 MINUTE DELAY
*******************************************************************************
[main] 2012-04-09 10:40:34,102 111670 DEBUG JdbcServicesImpl - JDBC version : 4.
0
[main] 2012-04-09 10:41:21,632 159200 INFO  Dialect - HHH000400: Using dialect: 
org.hibernate.dialect.PostgreSQLDialect
*******************************************************************************
[main] 2012-04-09 10:41:21,669 159237 INFO  LobCreatorBuilder - HHH000424: Disab
ling contextual LOB creation as createClob() method threw error : java.lang.refl
ect.InvocationTargetException
[main] 2012-04-09 10:41:21,814 159382 DEBUG SettingsFactory - Automatic flush du
ring beforeCompletion(): disabled
[main] 2012-04-09 10:41:21,814 159382 DEBUG SettingsFactory - Automatic session 
close at end of transaction: disabled
[main] 2012-04-09 10:41:21,815 159383 DEBUG SettingsFactory - JDBC batch size: 3
0
[main] 2012-04-09 10:41:21,816 159384 DEBUG SettingsFactory - JDBC batch updates
 for versioned data: disabled
[main] 2012-04-09 10:41:21,816 159384 DEBUG SettingsFactory - Scrollable result 
sets: enabled
[main] 2012-04-09 10:41:21,817 159385 DEBUG SettingsFactory - Wrap result sets: 
disabled
[main] 2012-04-09 10:41:21,818 159386 DEBUG SettingsFactory - JDBC3 getGenerated
Keys(): enabled
[main] 2012-04-09 10:41:21,818 159386 DEBUG SettingsFactory - JDBC result set fe
tch size: 100
[main] 2012-04-09 10:41:21,819 159387 DEBUG SettingsFactory - Connection release
 mode: auto
[main] 2012-04-09 10:41:21,819 159387 INFO  TransactionFactoryInitiator - HHH000
399: Using default transaction strategy (direct JDBC transactions)
[main] 2012-04-09 10:41:21,844 159412 DEBUG SettingsFactory - Default batch fetc
h size: 1
[main] 2012-04-09 10:41:21,844 159412 DEBUG SettingsFactory - Generate SQL with 
comments: disabled
[main] 2012-04-09 10:41:21,845 159413 DEBUG SettingsFactory - Order SQL updates 
by primary key: disabled
[main] 2012-04-09 10:41:21,846 159414 DEBUG SettingsFactory - Order SQL inserts 
for batching: disabled
[main] 2012-04-09 10:41:21,846 159414 DEBUG SettingsFactory - Query translator: 
org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory
[main] 2012-04-09 10:41:21,867 159435 INFO  ASTQueryTranslatorFactory - HHH00039
7: Using ASTQueryTranslatorFactory
[main] 2012-04-09 10:41:21,867 159435 DEBUG SettingsFactory - Query language sub
stitutions: {}
[main] 2012-04-09 10:41:21,867 159435 DEBUG SettingsFactory - JPA-QL strict comp
liance: disabled
[main] 2012-04-09 10:41:21,868 159436 DEBUG SettingsFactory - Second-level cache
: enabled
[main] 2012-04-09 10:41:21,868 159436 DEBUG SettingsFactory - Query cache: disab
led
[main] 2012-04-09 10:41:21,869 159437 DEBUG SettingsFactory - Cache region facto
ry : org.hibernate.cache.internal.NoCachingRegionFactory
[main] 2012-04-09 10:41:21,872 159440 DEBUG SettingsFactory - org.hibernate.cach
e.internal.NoCachingRegionFactory did not provide constructor accepting java.uti
l.Properties; attempting no-arg constructor.
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Optimize cache for
 minimal puts: disabled
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Structured second-
level cache entries: disabled
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Statistics: disabl
ed
[main] 2012-04-09 10:41:21,874 159442 DEBUG SettingsFactory - Deleted entity syn
thetic identifier rollback: disabled
[main] 2012-04-09 10:41:21,874 159442 DEBUG SettingsFactory - Default entity-mod
e: pojo
[main] 2012-04-09 10:41:21,875 159443 DEBUG SettingsFactory - Named query checki
ng : enabled
[main] 2012-04-09 10:41:21,875 159443 DEBUG SettingsFactory - Check Nullability 
in Core (should be disabled when Bean Validation is on): enabled
[main] 2012-04-09 10:41:21,876 159444 DEBUG SettingsFactory - multi-tenancy stra
tegy : NONE

デバッガーをステップスルーして、これについてもう少し調査しました。クラスパスにすべてのソースが含まれているわけではありませんが、変数は表示されます。その1分間の待機中に、Hibernateはpg_catalog.pg_typeテーブルにクエリを実行しています。

[SELECT typname FROM pg_catalog.pg_type WHERE oid = , ]

スクリーンショットは次のとおりです。

DebugWindow

4

7 に答える 7

131

私はそれを修正しました=)私はこれに対する答えを見つけるために本当に根を下ろさなければなりませんでした。基本的には、メタデータとJDBCドライバーのロードになります。操作に必要のないSQL列やその他のさまざまな構造の横にあるコメントを含むすべてのメタデータをロードしています。これがデフォルトでオンになっている理由はわかりませんが、明示的に必要な場合を除いて、この機能を必ずオフにする必要があります。

config.setProperty("hibernate.temp.use_jdbc_metadata_defaults","false");

今すぐ接続!

私がこれについて見つけることができる唯一の情報はコードにあります:

107     // 'hibernate.temp.use_jdbc_metadata_defaults' is a temporary magic value.
108     // The need for it is intended to be alleviated with future development, thus it is
109     // not defined as an Environment constant...
110     //
111     // it is used to control whether we should consult the JDBC metadata to determine
112     // certain Settings default values; it is useful to *not* do this when the database
113     // may not be available (mainly in tools usage).
114     boolean useJdbcMetadata = ConfigurationHelper.getBoolean( "hibernate.temp.use_jdbc_metadata_defaults", configValues, true );

http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate-core/4.1.1.Final/org/hibernate/engine/jdbc/internal/JdbcServicesImpl.java#JdbcServicesImpl

于 2012-04-11T15:23:55.580 に答える
11

また、hibernate.jdbc.use_get_generated_keysを有効にする必要がありました。そうしないと、ID生成戦略で例外がスローされていました。DBから受信したメタデータに基づいて自動的に有効化される前。したがって、私の全体的な解決策は、persistence.xmlに次の2行を追加することでした。

<property name="hibernate.jdbc.use_get_generated_keys" value="true" />
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
于 2015-10-03T01:08:45.607 に答える
5

ほぼ7年後、これはまだ問題です...

「temp」キーをオフにすると便利ですが、自動構成されるプロパティを1つずつ有効にするのは面倒です(他の回答を参照)。

OracleとTeradataの場合、そのような速度低下に気づかなかったので、深く掘り下げて、最も遅い部分がどこにあるかを見つけました: https ://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/ org / postgresql / jdbc / PgDatabaseMetaData.java#L2237

このresultSetには、私の場合は372行(タイプ)があります。次に、ドライバーごとに https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/jdbc/TypeInfoCache.java#L204から数回の呼び出しが発生し、 DBに対するSQLステートメント。

今のところこれを高速化する方法がわかりません。幸いなことに、一度必要になり、その後キャッシュされます。

于 2019-01-22T19:33:50.320 に答える
3

スクロール可能な結果セットに問題があったため、3番目のパラメーターを追加する必要がありました。以下を参照してください。

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<property name="hibernate.jdbc.use_get_generated_keys">true</property>
<property name="hibernate.jdbc.use_scrollable_resultset">true</property>
于 2018-09-11T21:18:31.207 に答える
1

1つのpostgresqlサーバーに複数のデータベースを含めることができます。残念ながら、他のデータベースのメタデータを1つの接続に隠すことはできません。そのため、jdbc-driverによるメタデータの読み取りに長い時間がかかります。

これらのデータベースを異なるpostgres-serverに分離すると、メタデータ読み取りのパフォーマンスが向上します。

CentOSで分離する方法を読んでください。

于 2016-04-27T10:10:51.937 に答える
0

これは、RubyonRailsで見た問題のように漠然と聞こえます。私がここで説明したものと同様の原因を探すかもし​​れません:

http://archives.postgresql.org/pgsql-performance/2009-11/msg00128.php

つまり、この問題は、複数のClassLoaderコンテキストからのJDBCドライバーの明示的な登録が原因でした。

于 2012-04-09T15:16:59.013 に答える
0

無効hibernate.temp.use_jdbc_metadata_defaultsにすると、アプリケーションの起動が増える可能性がありますが、一部の機能は無効になります。操作のようにbatch。hibernateがjdbcメタデータをロードしない場合、hibernateはグローバルバッチサイズを0に設定します。これは、バッチ操作を無効にすることを意味します。この場合、sessionスコープでバッチ操作を使用する唯一の方法です。以下のコード例のように

entityManager
    .unwrap( Session.class )
    .setJdbcBatchSize( 10 );

したがって、このプロパティを無効にするときは注意してください

于 2022-01-25T17:55:13.000 に答える