gpt4 book ai didi

java - Hibernate 和 MySQL 超出锁定等待超时(使用 Play Framework )

转载 作者:行者123 更新时间:2023-11-30 23:11:07 25 4
gpt4 key购买 nike

在我的 Web 应用程序中,我使用 Stateless sessionsHibernate在我的 inserts 上有更好的表现和 updates .

它在 H2 database 上运行良好(在开发模式下 play framework 中使用的那种)。

但是当我用 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 个简单的实体(ProductTypeRawMaterialTypePriceHistory)。 computeDeltacomputePrice只是没有数据库内容的算法函数。 retrieveAllWithHistory函数是使用 Play framework model 从数据库中获取一些数据的函数功能。

因此,此代码检索一些数据、编辑一些数据、创建新数据并最终保存所有内容。

为什么我有一个锁定异常 MySQL H2也不异常(exception)?

最佳答案

我不确定为什么要在 finally block 中进行提交。试试这个结构:

try {
factory.getCurrentSession().beginTransaction();
factory.getCurrentSession().getTransaction().commit();
} catch (RuntimeException e) {
factory.getCurrentSession().getTransaction().rollback();
throw e; // or display error message
}

此外,查看此 documentation 可能对您有所帮助.

关于java - Hibernate 和 MySQL 超出锁定等待超时(使用 Play Framework ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19664574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com