Hibernate での次のシーケンス値の効率的な取得
背景:
多くのエンティティではデータベースシーケンスから初期化された非 ID フィールド。通常、アプリケーションは初期シーケンス値をフェッチして保存し、必要に応じて値を増加させます。ただし、このアプローチは非効率的になる可能性があります。
改善された解決策:
Hibernate は、次のシーケンス値を取得するためのより良い方法を提供します。直接 SQL クエリを使用する代わりに、Hibernate の @GeneratedValue アノテーションを利用して、データベース シーケンスに基づいて主キーを生成します。 GenerationType.SEQUENCE のジェネレーター戦略を使用すると、エンティティの作成中に次のシーケンス値を自動的にフェッチできます。
直接 SQL クエリを回避します:
次のような直接 SQL クエリを使用します。 「select nextval('mySequence')」は、特に大規模なバッチの場合、多数のデータベース リクエストによりパフォーマンスを大幅に低下させる可能性があります。 Operations.
Use @GeneratedValue with @SequenceGenerator:
別の解決策は、@GeneratedValue および @SequenceGenerator アノテーションを持つ「偽の」エンティティを使用することです。このアプローチにより、Hibernate がシーケンス値のフェッチを管理できるようになり、パフォーマンスが大幅に向上します。
調査と発見:
さらなる調査により、Hibernate が内部でシーケンス値のフェッチ数を最小限に抑えていることが判明しました。同じシーケンスに対するリクエストをキャッシュすることによって。 @GeneratedValue を介してシーケンスにアクセスすることで、Hibernate は必要な直接 SQL クエリの数を減らします。
手動実装:
Hibernate の内部機能を手動で複製することは、次の作業が伴うため複雑です。キャッシュの管理と、さまざまなデータベースに対する方言固有の SQL コマンドのマッピング。この機能を抽象化するライブラリまたはフレームワークの使用を検討してください。
Hibernate Dialect API を使用したサンプル コード:
データベースの独立性が必要な場合は、Hibernate Dialect API を利用できます。 SequenceValueGetter クラスは、方言固有の SQL コマンドを利用して、次のシーケンス値を取得するメソッドを提供します。このアプローチは、異なるデータベース間でのシーケンス生成を処理するよりクリーンな方法を提供します。
class SequenceValueGetter { private SessionFactory sessionFactory; // For Hibernate 3 public Long getId(final String sequenceName) { final List<Long> ids = new ArrayList<>(1); sessionFactory.getCurrentSession().doWork(new Work() { public void execute(Connection connection) throws SQLException { DialectResolver dialectResolver = new StandardDialectResolver(); Dialect dialect = dialectResolver.resolveDialect(connection.getMetaData()); PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { preparedStatement = connection.prepareStatement(dialect.getSequenceNextValString(sequenceName)); resultSet = preparedStatement.executeQuery(); resultSet.next(); ids.add(resultSet.getLong(1)); } catch (SQLException e) { throw e; } finally { if (preparedStatement != null) { preparedStatement.close(); } if (resultSet != null) { resultSet.close(); } } } }); return ids.get(0); } }
以上がHibernate は次のシーケンス値の取得効率をどのように向上させることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。