hibernate構成関連必見(コレクション)
5116 ワード
Hibernateプロファイルには2つのフォーマットがあります.1つはhibernateです.もう一つはhibernatecfg.xml
後者は少し便利で、hbmマッピングファイルを追加するとき、hibernateに直接使用することができます.cfg.xmlの中に増加して、hibernateのようにする必要はありません.propertiesは初期化コードに追加する必要があります.
いずれにしても、両方の構成項目は同じですが、以下で詳しく説明します.
Hibernateのsrcディレクトリの下にhibernateがあります.propertiesテンプレート、自分で最初から書く必要はありません.テンプレートを修正すればいいです:)
この構成は、Hibernateにtrueを入力するとHibernateは1挿入データベースに変換され、Hibernateにfalseを入力するとHibernateは0挿入データベースに変換され、後のY,Nは同じです.
Oracleなどの一部のデータベースでは、booleanデータ型がなく、1がtrue、0がfalseを表すため、この構成を使用してHibernateで直接true/falseを使用すると直感的です.
これはMySQLデータベースに接続する例で、直感的で、説明する必要はありません.異なるデータベースの接続パラメータテンプレートにはすべて表示されています.
これはHibernateが所有する接続プールの構成パラメータで、デフォルトでは使用されます.意味は直観的で,あまり説明しない.
ただし、Hibernateという接続プールは非常に原始的で簡単な接続プールです.プロジェクトでHibernateを使用する場合は、App Serverの接続プールを優先し、HibernateバンドのDBPP接続プールを選択することをお勧めします.持参した接続プールは最終選択とすべきです.
DBPP接続プールを使用する場合は、DBPP接続プールの構成に加えて、下りのコメントをキャンセルする必要があります.
他の接続プールは同じです.
Appサーバの接続プールを使用し、Appサーバ接続プールのDataSourceのJNDI名が「mypool」であると仮定すると、以下のように構成されます.
Appサーバが接続プールを構成するときに指定されているため、他のパラメータは書く必要はありません.
リモート・クライアント・プログラムなどのHibernateをAppサーバ環境で使用しないで、Appサーバのデータベース接続プールを使用したい場合は、Hibernateがリモート・Weblogic上のデータベース接続プールに接続するなど、JNDIのパラメータを構成する必要があります.
最後に、EJBまたはJTAでHibernateを使用する必要がある場合は、次のコメントをキャンセルする必要があります.
その他の構成:
データベースにHibernateを送信するsqlを表示するかどうかは、非常に有用な機能です.Hibernateをデバッグするときに、Hibernateにsql文を印刷させると、問題を迅速に解決できます.
データベースの独立性レベルを指定すると、異なるデータベースに独自に定義された独立性レベルがあり、Hibernateの設定が変更できるとは限らないので、管理する必要はありません.
この2つのオプションはとても重要です!!!HibernateのCRUD性能に深刻な影響を及ぼす!
Fetch Sizeとは、JDBCのStatementがデータを読み込むときにデータベースから取り出すレコードの数を設定します.
たとえば、1回に1万件のレコードを問い合わせると、OracleのJDBCドライバでは1回に1万件を取り出すことはなく、Fetch Sizeの数だけが取り出され、レコードセットがこれらのレコードを遍歴した後、データベースからFetch Sizeのデータが取り出されます.
これにより、無駄なメモリ消費を大幅に削減できます.もちろんFetch Sizeが設定されているほど、データベースを読む回数が少なくなり、速度が速くなります.Fetch Sizeが小さいほど、データベースを読む回数が多くなり、速度が遅くなります.
これは、普段私たちがプログラムを書いてハードディスクファイルを書くように、Bufferを設立し、Bufferを書き込むたびに、Bufferがいっぱいになったら、一度にハードディスクに書き込むのと同じです.
OracleデータベースのJDBCドライバのデフォルトのFetch Size=10は、非常に保守的な設定です.私のテストによると、Fetch Size=50の場合、パフォーマンスは2倍以上向上します.Fetch Size=100の場合、パフォーマンスは20%向上し続けます.Fetch Sizeは増加し続け、パフォーマンスの向上は顕著ではありません.
したがって、Oracleを使用する場合は、必ずFetch Sizeを50に設定することをお勧めします.
ただし、すべてのデータベースがFetch Sizeプロパティをサポートしているわけではありません.たとえば、MySQLではサポートされていません.
MySQLは私が言ったような最悪の状況で、彼はいつも1万件の記録を完全に取り出して、メモリの消費はとても驚くことができます!この状況では良い方法はありません.(
Batch Sizeとは、データベースを一括削除し、一括更新や一括挿入する際のロットサイズを設定することであり、Bufferバッファサイズを設定することに相当する.
Batch Sizeが大きいほど,一括操作によるsqlのデータベースへの送信回数が少ないほど,速度が速くなる.私が行ったテストの結果、Batch Size=0の場合、Hibernateを使用してOracleデータベースから1万件のレコードを削除するのに25秒、Batch Size=50の場合、削除するのに5秒しかかかりません!!!
どのようなパフォーマンスの向上が見られますか?多くの人がHibernateとJDBCの挿入性能テストをすると、Hibernateの速度が少なくともJDBCの2倍であることが奇妙にわかります.HibernateがBatch Insertを使用しているのに、彼らが書いたJDBCがBatchを使用していないからです.
私の経験では、OracleデータベースBatch Size=30の場合が適切です.50も悪くありません.パフォーマンスは向上し続けます.50以上です.パフォーマンスの向上は非常に弱く、かえってメモリの消費量が多くなります.必要ありません.
JDBC 2が使用可能か否かを設定.0仕様のスクロール可能な結果セットは、Hibernateのページング表示に一定の役割を果たし、デフォルトであればよい.
デフォルトでは、cglib反射最適化を有効にします.cglibはHibernateでPOバイトコードを動的に生成するために用いられ,オン最適化はバイトコード構造の速度を速めることができる.
しかし、デバッグ中、特にproxy、lazy loadingに関連するアプリケーションでは、コードが間違っていますが、エラープロンプト情報が不明な場合は、cglibを最適化してオフにすることができます.これにより、Hibernateはより詳細なデバッグ情報を出力し、debugを支援します.
後者は少し便利で、hbmマッピングファイルを追加するとき、hibernateに直接使用することができます.cfg.xmlの中に増加して、hibernateのようにする必要はありません.propertiesは初期化コードに追加する必要があります.
いずれにしても、両方の構成項目は同じですが、以下で詳しく説明します.
Hibernateのsrcディレクトリの下にhibernateがあります.propertiesテンプレート、自分で最初から書く必要はありません.テンプレートを修正すればいいです:)
hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
この構成は、Hibernateにtrueを入力するとHibernateは1挿入データベースに変換され、Hibernateにfalseを入力するとHibernateは0挿入データベースに変換され、後のY,Nは同じです.
Oracleなどの一部のデータベースでは、booleanデータ型がなく、1がtrue、0がfalseを表すため、この構成を使用してHibernateで直接true/falseを使用すると直感的です.
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///test
hibernate.connection.username root
hibernate.connection.password
これはMySQLデータベースに接続する例で、直感的で、説明する必要はありません.異なるデータベースの接続パラメータテンプレートにはすべて表示されています.
hibernate.connection.pool_size 1
hibernate.statement_cache.size 25
これはHibernateが所有する接続プールの構成パラメータで、デフォルトでは使用されます.意味は直観的で,あまり説明しない.
ただし、Hibernateという接続プールは非常に原始的で簡単な接続プールです.プロジェクトでHibernateを使用する場合は、App Serverの接続プールを優先し、HibernateバンドのDBPP接続プールを選択することをお勧めします.持参した接続プールは最終選択とすべきです.
DBPP接続プールを使用する場合は、DBPP接続プールの構成に加えて、下りのコメントをキャンセルする必要があります.
hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider
他の接続プールは同じです.
Appサーバの接続プールを使用し、Appサーバ接続プールのDataSourceのJNDI名が「mypool」であると仮定すると、以下のように構成されます.
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.datasource mypool
hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider
Appサーバが接続プールを構成するときに指定されているため、他のパラメータは書く必要はありません.
リモート・クライアント・プログラムなどのHibernateをAppサーバ環境で使用しないで、Appサーバのデータベース接続プールを使用したい場合は、Hibernateがリモート・Weblogic上のデータベース接続プールに接続するなど、JNDIのパラメータを構成する必要があります.
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.datasource mypool
hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider
hibernate.jndi.class weblogic.jndi.WLInitialContextFactory
hibernate.jndi.url t3://servername:7001/
最後に、EJBまたはJTAでHibernateを使用する必要がある場合は、次のコメントをキャンセルする必要があります.
hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
その他の構成:
hibernate.show_sql false
データベースにHibernateを送信するsqlを表示するかどうかは、非常に有用な機能です.Hibernateをデバッグするときに、Hibernateにsql文を印刷させると、問題を迅速に解決できます.
#hibernate.connection.isolation 4
データベースの独立性レベルを指定すると、異なるデータベースに独自に定義された独立性レベルがあり、Hibernateの設定が変更できるとは限らないので、管理する必要はありません.
hibernate.jdbc.fetch_size 50
hibernate.jdbc.batch_size 25
この2つのオプションはとても重要です!!!HibernateのCRUD性能に深刻な影響を及ぼす!
C = create, R = read, U = update, D = delete
Fetch Sizeとは、JDBCのStatementがデータを読み込むときにデータベースから取り出すレコードの数を設定します.
たとえば、1回に1万件のレコードを問い合わせると、OracleのJDBCドライバでは1回に1万件を取り出すことはなく、Fetch Sizeの数だけが取り出され、レコードセットがこれらのレコードを遍歴した後、データベースからFetch Sizeのデータが取り出されます.
これにより、無駄なメモリ消費を大幅に削減できます.もちろんFetch Sizeが設定されているほど、データベースを読む回数が少なくなり、速度が速くなります.Fetch Sizeが小さいほど、データベースを読む回数が多くなり、速度が遅くなります.
これは、普段私たちがプログラムを書いてハードディスクファイルを書くように、Bufferを設立し、Bufferを書き込むたびに、Bufferがいっぱいになったら、一度にハードディスクに書き込むのと同じです.
OracleデータベースのJDBCドライバのデフォルトのFetch Size=10は、非常に保守的な設定です.私のテストによると、Fetch Size=50の場合、パフォーマンスは2倍以上向上します.Fetch Size=100の場合、パフォーマンスは20%向上し続けます.Fetch Sizeは増加し続け、パフォーマンスの向上は顕著ではありません.
したがって、Oracleを使用する場合は、必ずFetch Sizeを50に設定することをお勧めします.
ただし、すべてのデータベースがFetch Sizeプロパティをサポートしているわけではありません.たとえば、MySQLではサポートされていません.
MySQLは私が言ったような最悪の状況で、彼はいつも1万件の記録を完全に取り出して、メモリの消費はとても驚くことができます!この状況では良い方法はありません.(
Batch Sizeとは、データベースを一括削除し、一括更新や一括挿入する際のロットサイズを設定することであり、Bufferバッファサイズを設定することに相当する.
Batch Sizeが大きいほど,一括操作によるsqlのデータベースへの送信回数が少ないほど,速度が速くなる.私が行ったテストの結果、Batch Size=0の場合、Hibernateを使用してOracleデータベースから1万件のレコードを削除するのに25秒、Batch Size=50の場合、削除するのに5秒しかかかりません!!!
どのようなパフォーマンスの向上が見られますか?多くの人がHibernateとJDBCの挿入性能テストをすると、Hibernateの速度が少なくともJDBCの2倍であることが奇妙にわかります.HibernateがBatch Insertを使用しているのに、彼らが書いたJDBCがBatchを使用していないからです.
私の経験では、OracleデータベースBatch Size=30の場合が適切です.50も悪くありません.パフォーマンスは向上し続けます.50以上です.パフォーマンスの向上は非常に弱く、かえってメモリの消費量が多くなります.必要ありません.
#hibernate.jdbc.use_scrollable_resultset true
JDBC 2が使用可能か否かを設定.0仕様のスクロール可能な結果セットは、Hibernateのページング表示に一定の役割を果たし、デフォルトであればよい.
#hibernate.cglib.use_reflection_optimizer false
デフォルトでは、cglib反射最適化を有効にします.cglibはHibernateでPOバイトコードを動的に生成するために用いられ,オン最適化はバイトコード構造の速度を速めることができる.
しかし、デバッグ中、特にproxy、lazy loadingに関連するアプリケーションでは、コードが間違っていますが、エラープロンプト情報が不明な場合は、cglibを最適化してオフにすることができます.これにより、Hibernateはより詳細なデバッグ情報を出力し、debugを支援します.