目前我們正在使用遊戲1.2.5與Java和MySQL。我們有一個簡單的JPA模型(一個擴展模型類的Play實體)我們保存到數據庫中。最好的方法來處理多個插入
SimpleModel() test = new SimpleModel();
test.foo = "bar";
test.save();
在每個Web請求我們保存SimpleModel的多個實例,例如:
JPAPlugin.startTx(false);
for (int i=0;i<5000;i++)
{
SimpleModel() test = new SimpleModel();
test.foo = "bar";
test.save();
}
JPAPlugin.closeTx(false);
我們使用JPAPlugin.startTx和closeTx手動啓動和結束交易。 如果只有一個請求執行事務,一切正常。 我們注意到,如果第二個請求試圖同時執行循環,第二個請求會獲得「超出鎖定等待超時;嘗試重新啓動事務javax.persistence.PersistenceException:org.hibernate.exception.GenericJDBCException:could not insert:[ SimpleModel]「,因爲第一個請求會鎖定表,但在第二個請求超時之前不會完成。 這導致多個:
錯誤AssertionFailure:45 - 斷言失敗發生(這可能表明在Hibernate中的一個錯誤,但更可能是由於不安全使用會話) org.hibernate.AssertionFailure:空id在SimpleModel條目中(發生異常後不刷新會話)
另一個消毒是插入過程中的CPU使用率變得瘋狂。
爲了解決這個問題,我想創建一個事務感知隊列來按順序插入實體,但這會導致巨大的插入時間。 處理這種情況的正確方法是什麼?
我會試着用2x來看看會發生什麼。 – kospol