java - hibernate 延迟写入

标签 java hibernate

我想知道 hibernate 是否有可能延迟它对数据库的写入。我为mysql配置了hibernate。我希望支持的场景是 80% 读取和 20% 写入。所以我不想优化我的写入,我宁愿让客户端等到数据库被写入,而不是更早返回。我的测试目前有 100 个客户端并行,CPU 有时会达到极限。我需要这个 flush 方法来立即写入 DB 并仅在写入数据时返回。

在我的客户端,我发送一个写入请求,然后发送一个读取请求,但读取请求有时会返回 null。我怀疑 hibernate 没有立即写入数据库。

public final ThreadLocal    session = new ThreadLocal();

public Session currentSession() {
    Session s = (Session) session.get();
    // Open a new Session, if this thread has none yet
    if (s == null || !s.isOpen()) {
        s = sessionFactory.openSession();
        // Store it in the ThreadLocal variable
        session.set(s);
    }
    return s;
}
public synchronized void flush(Object dataStore) throws DidNotSaveRequestSomeRandomError {
    Transaction txD;
    Session session;
    session = currentSession();
    txD = session.beginTransaction();
    session.save(dataStore);
    try {
        txD.commit();
    } catch (ConstraintViolationException e) {
        e.printStackTrace();
        throw new DidNotSaveRequestSomeRandomError(dataStore, feedbackManager);
    } catch (TransactionException e) {
        log.debug("txD state isActive" + txD.isActive() + " txD is participating" + txD.isParticipating());
        log.debug(e);
    } finally {
        // session.flush();
        txD = null;
        session.close();
    }
    // mySession.clear();
}

最佳答案

@Siddharth Hibernate 并没有真正延迟编写响应,而且您的代码也不相同。我之前也遇到过类似的问题,怀疑你是否也面临同样的问题,即当有大量写入 hibernate 的请求时,是否有许多线程共享你的数据库的相同实例,甚至 hibernate 连续提交你真的看不到任何变化. 您也可以通过在事务期间简单地查看 MySQL 日志来发现这一点,看看究竟出了什么问题!

关于java - hibernate 延迟写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846702/

相关文章:

java - C 整数与 Java 读取的字节并集并重新转换为 Java int

java - Android 使用带有 HTTPS 的 Ksoap2 请求

java - 为什么双击显示日期对话框

java - 每次迭代后删除二维数组的列和行

java - 如何使用 JPA 锁定数据库行

java - 如何去除 JFormattedTextField 的掩码?

java - Hibernate EmptyInterceptor onFlushDirty() 没有执行

hibernate - Hibernate 5.2.2 中 createCriteria() 方法的替代代码

java - 每天跟踪 JPA/Hibernate 更新/插入的日志文件

java - hibernate Java 10