Hibernateでパフォーマンスに問題があります。Hibernate - 何度も同じ操作を実行すると遅くなり、遅くなります
Hibernate : 3.2.6.ga
JDK : jdk1.6.0_45
私はEntityManagerにリンクされている@Transactionnalというアノテーションが付けられています。
この関数は、ループ内で呼び出されたので、私が持っている:
for (Item i : itemList)
{
saveIt(i);
}
それは私がそれを5/10/20回を起動した場合、処理時間が増加していないようです大丈夫です。 しかし、私が300/400回起動すると、 "saveit"する時間が遅くなり、遅くなります。 私はJavaメモリを監視しましたが、何か変わったことはありませんでした。
だから、Flush/Cleanの魔法の解決策について話している記事があります。 私はそれを試したと時間、それは動作します。
for (Item i : itemList)
{
saveit(i);
cleanMySession();
}
しかし、私は、私はこのループの外に休止状態に関連する他の何かをしないときに特別...たぶん私は少し午前、@Transactionnal注釈は、すべてこのようなものを管理することを考えたので、私には、それは、かなり奇妙ですビットが失われました...
最終的な質問:この回避策は安全ですか?
メモ:実際には、saveIt関数はデータ操作の面で非常に巨大なので、処理時間は非常に重要であり、増やしてはいけません。
EDIT - 追加情報:
私は私のcleanSession機能でデバッグモードで停止:ここ
public void cleanSession() {
Session session = (Session) em.getDelegate();
session.flush();
session.clear();
}
はスタックです:
MyServiceImpl.cleanSession() line: 177
GeneratedMethodAccessor216.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) line: 319
JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 196
$Proxy40.cleanSession() line: not available
MyAction.doSave() line: 814
StrutsStack...
はそうです、私はいくつかのプロキシを参照してくださいそれだけには私は、このプロキシはHibernateからではなく、Spring Injectionから来ています。
編集N°2:
はい、私はOpenSessionInViewフィルタ
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>
forループを含むメソッドの名前は何ですか?あなたはそれをStackで報告することもできますか? – Thierry
MyActionクラスの "doSave"です。これはStrutsコントローラクラスです。 – Johann
だから、forループは 'MyAction.doSave()'メソッドにあると思います。そして、あなたは$ Proxy40よりもスタック内に他の$ Proxyがありません(スタックの上、印刷スタックトレースの下)。 openSessionInViewFilterを使用していますか? – Thierry