mysql - Hibernate findById 没有找到它以前找到的记录

标签 mysql hibernate tomcat

我们有一个使用“findById”的非常简单的方法。

public Cart getCart(long cartId) {
    Cart cart = null;

    try {

        dbSession.beginTransaction();
        cart = (Cart)dbSession.findById(Cart.class, cartId);
        dbSession.commitTransaction();

        if (logger.isDebugEnabled()) {
            logger.debug("The getCart call committed successfully");
        }

    } finally {
        if (dbSession.needsRollback()) {
            dbSession.rollbackTransaction();
        }
    }

    logGetCartResults(cartId, cart);

    return cart;
}

private void logGetCartResults(long cartId, Cart cart) {
    if (logger.isDebugEnabled()) {

        StringBuffer message = new StringBuffer("Cart id ");
        message.append(cartId)
               .append(" was ");

        if (cart != null) {
            message.append("not ");
        }

        message.append("null");

        logger.debug(message.toString());
    }
}

此方法有时会从另一个应用程序快速连续调用(它基本上是另一个加载购物车的系统)。我们有一个制作购物车的线程,将记录提交到数据库,然后应用程序为需要进入数据库的每个项目调用一次。虽然其他应用程序按顺序发送并等待响应,但 tomcat 在单独的线程上获取这些。

我们看到对“getCart”的初始调用实际上能够找到记录。有时,一个调用会失败,即使在其他调用已经成功之后也是如此。以下是提供更多上下文的一些日志:

    DEBUG 2009-06-18 16:10:57,145 [http-8080-Processor20] com.eroi.managers.impl.DefaultPurchaseManager: Looking for cartId 49
    DEBUG 2009-06-18 16:10:57,146 [http-8080-Processor20] com.eroi.persistors.impl.DefaultPurchasePersistor: The getCart call committed successfully
    DEBUG 2009-06-18 16:10:57,146 [http-8080-Processor20] com.eroi.persistors.impl.DefaultPurchasePersistor: Cart id 49 was not null
    ...
    DEBUG 2009-06-18 16:10:57,522 [http-8080-Processor14] com.eroi.managers.impl.DefaultPurchaseManager: Looking for cartId 49
    DEBUG 2009-06-18 16:10:57,523 [http-8080-Processor14] com.eroi.persistors.impl.DefaultPurchasePersistor: The getCart call committed successfully
    DEBUG 2009-06-18 16:10:57,523 [http-8080-Processor14] com.eroi.persistors.impl.DefaultPurchasePersistor: Cart id 49 was not null
    ...
    DEBUG 2009-06-18 16:10:57,934 [http-8080-Processor10] com.eroi.managers.impl.DefaultPurchaseManager: Looking for cartId 49    
    DEBUG 2009-06-18 16:10:57,934 [http-8080-Processor10] com.eroi.persistors.impl.DefaultPurchasePersistor: The getCart call committed successfully
    DEBUG 2009-06-18 16:10:57,934 [http-8080-Processor10] com.eroi.persistors.impl.DefaultPurchasePersistor: Cart id 49 was null

所以。线程 20、14 成功,但线程 10 找不到记录。是什么赋予了?我们没有进行任何缓存(默认的一级缓存除外)。

<hibernate-configuration>
    <session-factory>
        <property name="current_session_context_class">thread</property>
        <property name="hibernate.connection.datasource">java:/comp/env/jdbc/ourdb</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    </session-factory>
</hibernate-configuration>

任何见解、想法或 . . .好吧,任何事情,不胜感激。

最佳答案

是否有可能在线程 10 开始其事务时 ID 尚未完全提交?所以基本上我在问 - 如果数据库中已经有购物车 49(比如在程序开始时)线程是否仍然存在这个问题?

关于mysql - Hibernate findById 没有找到它以前找到的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1015778/

相关文章:

php - SQL/PHP - 计算结果并根据 HAVING 子句显示它们

mysql - 在 JSP 中,用 "N/A"替换从 mysql 数据库中检索到的空值

java - 是否应该在进入 Java 之前克隆 Date 对象

java - hibernate 与 ProjectionList 错误 : cannot be cast to [Ljava. lang.Object;

java - 无法在没有 Moskito UI 的情况下找到 Moskito 与 java web 应用程序集成的解决方案

mysql - “名为 MySQL 的 Windows 服务已存在”。如何删除我的电脑中已存在的 MySQL 服务名称

mysql - 表 MySql.proc 不存在

spring - 使用 Hibernate 使用外键 (where) 查询数据库表

java - 将 Maven 依赖项添加回 GraphHopper 的类路径会导致工作中的 Tomcat 服务器失败

java Servlet代理不下载某些pdf文件