2012-01-13 91 views
3

我想知道是否有休眠延迟其写入数据库的可能性。我有配置为MySQL的休眠。我希望支持的情景是80%的读取和20%的写入。所以我不想优化我的写入,我宁愿让客户端等到数据库被写入,而不是稍后返回。我的测试目前有100个并行的客户端,cpu有时会最大限度地运行。我需要这种刷新方法立即写入数据库,并仅在数据写入时才返回。休眠延迟写

在我的客户端,我发送了一个写请求,然后发送了一个读请求,但是这个读请求有时会返回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(); 
} 

回答

2

@Siddharth Hibernate并没有真正延迟写入响应,而且你的代码也不完全相同。我之前也遇到过类似的问题,怀疑你可能会面对同样的情况,那就是,当有大量写入hibernate的请求时,有很多线程共享你的数据库的相同实例,甚至通过休眠连续提交,你真的没有看到任何改变。 您也可以通过在交易期间简单地查看MySQL日志来了解这一点,并查看究竟发生了什么问题!

+0

花了我一些时间进行调试。 Mysql日志非常棒。所以这些是我调试的结果。如果我 – Siddharth 2012-01-16 05:14:44

2

感谢您的提示。花了我一些时间来调试。 Mysql日志非常棒。 这是我运行检查插入和mysql写入时间戳。 mysql将所有数据库操作记录在二进制日志中。要阅读它,我们需要使用名为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在日志上方的1行以获取时间戳。然后在java中,我调用Calendar.getInstance()。getTimeInMilli()来与时间戳进行比较。 sudo mysqlbinlog mysql/mysql-bin.000004 | grep“mystring”-1

所以我调试了我的问题。这是一个延迟写入问题。所以我实现了同步写入,而不是所有的异步。换句话说,服务器调用不会返回,直到db被刷新为这个对象。

+1

我进一步调试,发现我的mysql bin日志正在写入数据库“SET TIMESTAMP = 1327039370/*!* /插入到”。我的阅读发生在“1327039372711”(java new Calendar.getInstance()。getTimeInMilli())。似乎我的写作是在我阅读之前发生的,但是阅读失败。我正在使用hibernate“Query rowResult = session.createSQLQuery(rowQuery).addEntity(table.getClass());” – Siddharth 2012-01-20 06:12:50

+0

我面临同样的问题,请你让我知道如何改变异步调用来在休眠中同步 – 2015-03-12 10:33:11