我有Hibernate的性能問題。休眠 - 多次啓動相同的操作變得越來越慢
Hibernate : 3.2.6.ga
JDK : jdk1.6.0_45
我有一個函數witch被註釋@Transactionnal鏈接到一個EntityManager。
該功能被稱爲一個循環,所以我有:
for (Item i : itemList)
{
saveIt(i);
}
它的確定,如果我啓動它5/10/20次,處理時間似乎並沒有增加。 但是,如果我啓動300/400次,「saveit」的時間越來越慢... 我監控了java內存,並沒有看到奇怪的東西。
所以我找到一些關於Flush/Clean魔術解決方案的文章。 我試過了,它是有效的。
for (Item i : itemList)
{
saveit(i);
cleanMySession();
}
但對我來說這是很奇怪的,因爲我認爲@Transactionnal註釋管理這一切的東西,特別是當我沒有做任何其他與此相關的循環外休眠...也許我有點bit lost ...
最後的問題:這個解決方法是否安全?
注意:實際上,saveIt函數在數據操作方面相當龐大,所以處理時間非常重要,不能增加。
編輯 - 附加信息:
我停在調試模式下在我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...
所以,是的,我看到一些代理,但對我這個代理來自Spring注入,而不是來自Hibernate。
編輯N°2:
是的,我使用OpenSessionInView過濾
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>
包含for循環的方法的名稱是什麼?你能否在堆棧中報告它(如果你過濾了它)? – Thierry
這是MyAction類中的「doSave」。這是Struts控制器類。 – Johann
好的,我猜測for循環是在'MyAction.doSave()'方法中。並且在$ Proxy40中您沒有其他的$ Proxy(堆棧中的上面,打印的堆棧跟蹤中的下面)?你使用openSessionInViewFilter嗎? – Thierry