8

パブリックゲッターメソッドの代わりにプライベートフィールドを使用してエンティティにアノテーションを付けることのパフォーマンスの違いについて、誰かが難しい数字を持っているかどうか知りたいと思いました。フィールドは「リフレクションによる」と呼ばれるため遅いと言われていると聞きましたが、ゲッターメソッドもそうですよね?Hibernateは、フィールドを読み取ろうとする前に、フィールドのアクセシビリティをtrueに設定する必要があります。これは、わずかなオーバーヘッドがあることがわかります。しかし、それはセッションのスコープ内のクラスレベルで行われるのではないでしょうか、それとも構成が読み取られてSessionFactoryが構築されるときに1回だけ行われるのでしょうか。

これが神話なのか、それとも本当に真実なのか、興味があります。個人的には、フィールドに注釈を付けるともう少し読みやすくなります。

4

3 に答える 3

9

5000レコードを単純な3列のテーブルにロードしました。2つのクラスをそのテーブルにマップしました。1つは注釈付きのプライベートフィールドを使用し、もう1つは注釈付きのパブリックゲッターを使用します。SpringのHibernateTemplate.loadAll()を30回実行した後、HibernateTemplate.clear()を実行して、セッションキャッシュをパージしました。以下のミリ秒単位の結果...

メソッドの合計:6510、平均:217

フィールドの合計:6586、平均:219

各クラスにプロパティを追加した後、おそらくもう一度突き刺す必要がありますが、現時点では、その差は統計的に有意ではないようです。

于 2008-12-02T01:38:40.603 に答える
1

わかりました、数字を与えることはできませんが、リフレクションを介してフィールドにアクセスすることは「1回限り」のことではないと思います。各オブジェクトには独自のプライベートメンバーがあります。

正直なところ、リフレクションについてはよくわかりませんが、ゲッター/セッターは率直である必要があります。実際、メソッドの1つをprivateに設定してみることができますが、必要なメソッドが見つからないため、機能しないと思います。

エンティティのロード方法にもよりますが、getterメソッドに影響を与えるプロキシのような他の問題があります。

これは私がドキュメントで見るすべてです:

access属性を使用すると、実行時にHibernateがプロパティにアクセスする方法を制御できます。デフォルトでは、Hibernateはプロパティのget/setペアを呼び出します。access = "field"を指定すると、Hibernateはget / setペアをバイパスし、リフレクションを使用してフィールドに直接アクセスします。インターフェイスorg.hibernate.property.PropertyAccessorを実装するクラスに名前を付けることで、プロパティアクセスの独自の戦略を指定できます。

私の推測では、一般的にリフレクションはより高いコストになるでしょうが、申し訳ありません..数字はありません:(

于 2008-12-01T23:39:25.553 に答える
0

通常、getter メソッドの上でアノテーションを使用します。クラスが JVM にロードされると、休止状態のモデルまたはエンティティ クラスもロードされるため、フィールドまたは peroperty の上でアノテーションを使用すると、リクエストごとに 1 回だけ実行されます。一方、ゲッターの上に配置し、リフレクションまたは他のレイヤーでこのクラスを呼び出すと、ゲッターメソッドが呼び出され、これは非常に便利になります

于 2013-03-12T07:57:06.700 に答える