私の Web アプリケーションでは、とのパフォーマンスを向上させるためにStateless sessions
withを使用しています。Hibernate
inserts
updates
(開発モードのプレイフレームワークH2 database
で使用されるもの)で正常に動作していました。
しかし、私がそれをテストするとMySQL
、次の例外が発生します:
ERROR ~ Lock wait timeout exceeded; try restarting transaction
ERROR ~ HHH000315: Exception executing batch [Lock wait timeout exceeded; try restarting transaction]
コードは次のとおりです。
public static void update() {
Session session = (Session) JPA.em().getDelegate();
StatelessSession stateless = this.session.getSessionFactory().openStatelessSession();
try {
stateless.beginTransaction();
// Fetch all products
{
List<ProductType> list = ProductType.retrieveAllWithHistory();
for (ProductType pt : list) {
updatePrice(pt, stateless);
}
}
// Fetch all raw materials
{
List<RawMaterialType> list = RawMaterialType.retrieveAllWithHistory();
for (RawMaterialType rm : list) {
updatePrice(rm, stateless);
}
}
} catch (Exception ex) {
play.Logger.error(ex.getMessage());
ExceptionLog.log(ex, Thread.currentThread());
} finally {
stateless.getTransaction().commit();
stateless.close();
}
}
private static void updatePrice(ProductType pt, StatelessSession stateless) {
pt.priceDelta = computeDelta();
pt.unitPrice = computePrice();
stateless.update(pt);
PriceHistory ph = new PriceHistory(pt, price);
stateless.insert(ph);
}
private static void updatePrice(RawMaterialType rm, StatelessSession stateless) {
rm.priceDelta = computeDelta();
rm.unitPrice = computePrice();
stateless.update(rm);
PriceHistory ph = new GoodPriceHistory(rm, price);
stateless.insert(ph);
}
この例では、3 つの単純なエンティティ( ProductType
、RawMaterialType
およびPriceHistory
) があります。
computeDelta
DBのcomputePrice
ものを含まない単なるアルゴリズム関数です。
retrieveAllWithHistory
関数は、関数を使用してデータベースからデータをフェッチするPlay framework model
関数です。
したがって、このコードはデータを取得し、編集し、新しいデータを作成して、最後にすべてを保存します。
でロック例外がMySQL
あり、で例外がないのはなぜH2
ですか?