hibernate 休眠延迟写入

flmtquvp  于 2023-01-02  发布在  其他
关注(0)|答案(2)|浏览(140)

我想知道是否有一种可能性,即Hibernate会延迟它对DB的写入。我为MySQL配置了Hibernate。我希望支持的场景是80%读取和20%写入。因此,我不想优化我的写入,我宁愿让客户端等到DB被写入,而不是早一点返回。我的测试目前有100个客户端并行。cpu有时会达到最大值。我需要这个flush方法来立即写入数据库,并且只在数据被写入时返回。
在我的客户端,我发送一个write请求,然后发送一个read请求,但是read请求有时返回null,我怀疑hib没有立即写入db。

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();
}
tyu7yeag

tyu7yeag1#

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

8mmmxcuj

8mmmxcuj2#

谢谢你的提示。花了我一些时间来调试。Mysql日志是惊人的。这是我运行检查我的插入和mysql写入的时间戳。mysql记录所有的数据库操作在一个binlog。要读取它,我们需要使用名为mysqlbinlog的工具。my.cnf也需要http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtpm7%2Fm7enablelogs.html
我检查哪个是最新的mysql bin日志文件,并在grep中运行该日志文件以获取时间戳,然后在java中调用Calendar.getInstance().getTimeInMilli()与时间戳. sudo mysqlbinlog mysql/mysql-bin.000004 | grep "mystring" -1进行比较
所以我调试了我的问题。这是一个延迟写入的问题。所以我也实现了同步写入而不是所有的异步。换句话说,服务器调用不会返回,直到数据库为这个对象刷新。

相关问题