MySql延迟/丢弃UPDATE / INSERT / DELETE语句

时间:2012-06-27 14:16:21

标签: mysql jpa eclipselink

我使用MySQL 5.5作为基于EclipseLink的Web应用程序持久性后端的数据库。 Web应用程序是使用Wicket 1.5在Java 7上构建的。测试环境在Jetty 7 / Mac OSX Lion上运行,Tomcat 6 / Red Hat Enterprise 6.1上的生产环境。

这就是:在Web应用程序中,轻量级cms,在执行多次写入操作后,写入操作开始被延迟或丢弃。读取查询日志显示,不知何故,这些操作不会立即执行(即使我在代码中显式执行了所有事务提交),但稍后,由另一个写操作触发,突然执行较旧的写操作(在单个交易)。请注意,它们不一定按顺序执行(可能是线程问题?)。

错误发生在生产环境中比在测试环境中更早,但最终确实发生在两者中。它只发生在我使用MySql数据库时,而不是我用于单元测试代码的内存H2数据库。我开始认为这是一个问题,Tomcat以某种方式缓存表单提交但是因为在Jetty测试环境中我可以重现我专注于MySQL的问题。

现在我绝不是MySQL专家,但我尝试了一些摆弄query_cache系统变量无济于事。我也希望设置flush = on会有所帮助,但事实并非如此。

我基于上述问题的问题是,这确实是一个MySQL问题,还是我必须检查其他地方?如果是这样,任何人都可以指出出了什么问题吗?也许这是一个相当广泛的问题,但如果它的任何一部分与某人敲响钟声,那将真的很有帮助。

提前致谢。

修改

我包含了EclipseLink日志的一部分。正如我所看到的,Thread ... -20,5使用UoW ... 7099进行所有工作。然后由于某种原因它切换到线程... -17,5。该线程请求新的UoW ... 1848。到目前为止这么好,但是在这段摘录结束时,EL实际上将持续操作分配给... 7099,同时提交... 1848。请注意,我没有在我的代码中明确请求UoW,我只使用EntityManager。在日志下方,您还可以找到persistence.xml。

EclipseLink日志


[EL Finest]: 2012-07-10 14:52:16.113--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-20,5,main])--persist() operation called on: NewsItem(id=0, header=7, content=7, timeStamp=2012-07-10T14:52:16.113+02:00).
[EL Finest]: 2012-07-10 14:52:16.114--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-20,5,main])--assign sequence to the object (258 -> NewsItem(id=0, header=7, content=7, timeStamp=2012-07-10T14:52:16.113+02:00))
[EL Finer]: 2012-07-10 14:52:16.114--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-20,5,main])--begin unit of work commit
[EL Finest]: 2012-07-10 14:52:16.115--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-20,5,main])--Execute query InsertObjectQuery(NewsItem(id=258, header=7, content=7, timeStamp=2012-07-10T14:52:16.113+02:00))
[EL Finest]: 2012-07-10 14:52:16.115--ServerSession(1463061321)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--Connection acquired from connection pool [default].
[EL Finer]: 2012-07-10 14:52:16.116--ClientSession(1223119569)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--begin transaction
[EL Fine]: 2012-07-10 14:52:16.116--ClientSession(1223119569)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--INSERT INTO NEWSITEM (ID, CONTENT, HEADER, TIMESTAMP) VALUES (?, ?, ?, ?)
    bind => [258, 7, 7, 10 juli 2012 14:52]
[EL Finer]: 2012-07-10 14:52:16.118--ClientSession(1223119569)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--commit transaction
[EL Finest]: 2012-07-10 14:52:16.118--ServerSession(1463061321)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--Connection released to connection pool [default].
[EL Finer]: 2012-07-10 14:52:16.119--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-20,5,main])--end unit of work commit
[EL Finer]: 2012-07-10 14:52:16.119--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-20,5,main])--resume unit of work
[EL Finest]: 2012-07-10 14:52:16.12--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-20,5,main])--Execute query ReportQuery(referenceClass=NewsItem sql="SELECT COUNT(ID) FROM NEWSITEM")
[EL Finest]: 2012-07-10 14:52:16.12--ServerSession(1463061321)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--Connection acquired from connection pool [default].
[EL Fine]: 2012-07-10 14:52:16.12--ServerSession(1463061321)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--SELECT COUNT(ID) FROM NEWSITEM
[EL Finest]: 2012-07-10 14:52:16.122--ServerSession(1463061321)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--Connection released to connection pool [default].
[EL Finest]: 2012-07-10 14:52:16.122--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-20,5,main])--Execute query ReadAllQuery(referenceClass=NewsItem sql="SELECT ID, CONTENT, HEADER, TIMESTAMP FROM NEWSITEM ORDER BY TIMESTAMP DESC")
[EL Finest]: 2012-07-10 14:52:16.122--ServerSession(1463061321)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--Connection acquired from connection pool [default].
[EL Fine]: 2012-07-10 14:52:16.122--ServerSession(1463061321)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--SELECT ID, CONTENT, HEADER, TIMESTAMP FROM NEWSITEM ORDER BY TIMESTAMP DESC
[EL Finest]: 2012-07-10 14:52:16.124--ServerSession(1463061321)--Connection(1934751546)--Thread(Thread[qtp1629549850-20,5,main])--Connection released to connection pool [default].
[EL Finer]: 2012-07-10 14:59:32.322--ServerSession(1463061321)--Thread(Thread[qtp1629549850-17,5,main])--client acquired: 1003847240
[EL Finer]: 2012-07-10 14:59:32.322--ClientSession(1003847240)--Thread(Thread[qtp1629549850-17,5,main])--acquire unit of work: 1029031848
[EL Finest]: 2012-07-10 14:59:32.322--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-17,5,main])--persist() operation called on: NewsItem(id=0, header=8, content=8, timeStamp=2012-07-10T14:59:32.322+02:00).
[EL Finest]: 2012-07-10 14:59:32.323--UnitOfWork(1257127099)--Thread(Thread[qtp1629549850-17,5,main])--assign sequence to the object (259 -> NewsItem(id=0, header=8, content=8, timeStamp=2012-07-10T14:59:32.322+02:00))
[EL Finer]: 2012-07-10 14:59:32.323--UnitOfWork(1029031848)--Thread(Thread[qtp1629549850-17,5,main])--begin unit of work commit
[EL Finer]: 2012-07-10 14:59:32.323--UnitOfWork(1029031848)--Thread(Thread[qtp1629549850-17,5,main])--end unit of work commit
[EL Finer]: 2012-07-10 14:59:32.323--UnitOfWork(1029031848)--Thread(Thread[qtp1629549850-17,5,main])--resume unit of work
[EL Finer]: 2012-07-10 14:59:32.324--UnitOfWork(1029031848)--Thread(Thread[qtp1629549850-17,5,main])--release unit of work

的persistence.xml

<persistence-unit name="mySqlJpaPu" transaction-type="RESOURCE_LOCAL">
  <properties>
    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
    <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/xxx" />
    <property name="javax.persistence.jdbc.user" value="xxx" />
    <property name="javax.persistence.jdbc.password" value="xxx" />
    <property name="eclipselink.ddl-generation" value="create-tables" />
    <property name="eclipselink.logging.level" value="ALL"/>
  </properties>
</persistence-unit>

3 个答案:

答案 0 :(得分:1)

我严重怀疑这是MySQL数据库的一个问题。相反,我怀疑EclipseLink与事务管理器的交互是一个问题。您没有提到您是否使用外部事务管理器(JTA或OTS)。

调用UnitOfWork commit方法时,应该将更改应用于数据库。这是真的,除非UnitOfWork是父UnitOfWork的子级。对于子UnitOfWork,commit方法不会对数据库应用更改;它将任何更改传递给其父UnitOfWork。

如果是我的代码,我会检查它以验证我没有处理嵌套的工作单元。我将验证对acquireUnitOfWork方法的调用是在会话对象上,而不是在另一个UnitOfWork对象上。

答案 1 :(得分:0)

启用EclipseLink中的日志记录并检查日志。事务在日志中是否显示正确,是您期望的事务的写入部分吗?

您使用什么类型的连接池和事务控制?包括你的persistence.xml。

您是如何创建EntityManagers的(我假设您使用的是JPA?)。听起来您正在使用不同的线程/请求共享相同的EntityManager。每个线程/请求/事务都应该有自己的EntityManager。

答案 2 :(得分:0)

您是如何获得EntityManagers并开始/提交交易的?看起来您可能正在获取一个新的EntityManager并使用它来开始/提交事务而不是您使用它进行更改的事务。