1

読み取りと書き込みに関して、休止状態はどのように機能しますか。

  1. アプリケーションが DB にさらに書き込みを行う場合、休止状態はどのように機能しますか? この場合、書き込みごとにキャッシュを更新する必要があることを理解していますが、これとは別に、(JDBC と比較して) パフォーマンスのオーバーヘッドがあります。

  2. アプリケーションがデータを読み取るだけの場合 (書き込み/更新はほとんどありません)、休止状態はどのように機能しますか? この場合、キャッシュを更新する必要がないため、休止状態のパフォーマンスは JDBC と同じくらい (またはそれ以上) になると期待できます (適切に調整されている場合)。

また、ケース 2 で (ORM 以外で) 使用する最適なオプションを理解したいと考えています。

4

2 に答える 2

1

余分なレイヤーを追加すると、常にパフォーマンスが低下します。ただし、この余分なレイヤーにより、開発時間が短縮される場合もあります。したがって、すべてはユースケースとパフォーマンス要件に依存します。ORM を使用すると、読み取りとクエリの第 2 レベルのキャッシュを有効にできます。これがアプリケーション レベルのパフォーマンスです。ただし、ネイティブ DB キャッシングで十分な場合もあります (このようにして、クラスター内の各ノードはキャッシングを回避できます)。

于 2012-08-08T11:51:05.310 に答える
1

Hibernate は、開発をはるかに容易にするツールです。(私自身の経験に基づいて) Hibernate のオーバーヘッドはそれほど大きくないと感じています。おそらく、独自の SQL 結果をオブジェクト マッピングに書き込むことになるでしょう。うまくいけば、Hibernate よりもわずかに速いかもしれません。でも:

  • Hibernate はセッションで L1 キャッシュを行うため、DB からデータを取得したかどうかを覚えておく必要はありません。
  • Hibernate のパフォーマンス チューニングは、JDBC よりもはるかに簡単です。ライブ アプリに Javamelody をプラグインし、最も遅い SQL を探してから、イージー ロードとレイジー ロードを試して処理を高速化します。SQL を書き直す必要も、マッピング コードに触れる必要もありません。いくつかの注釈を調整するだけです
  • L2 キャッシングは非常に簡単です。DB キャッシングでうまくいく場合もありますが、それには限界があります。Hibernate では、リレーション キャッシュとクエリ キャッシュを有効にできます。DB がボトルネックであり、アプリケーションが複数のノードにデプロイされている場合、違いがわかります。分散キャッシュは、DB に何千回もアクセスするよりもはるかに高速です。

結論として、はい、Hibernate にはオーバーヘッドがありますが、私にとってチューニング機能は非常に重要であり、複雑なアプリケーションでプレーンな JDBC よりも Hibernate の方がパフォーマンスが向上する可能性があります (そしてその可能性が非常に高いです)。Hibernate と QueryDSL を使用した開発は、プレーンな JDBC よりもはるかに高速であると言う必要はありません。

于 2012-08-08T20:32:47.507 に答える