WebアプリへのEclipseLinkベースの永続性バックエンドのデータベースとしてMySQL5.5を使用しています。Webアプリは、Java7でWicket1.5を使用して構築されています。テスト環境はJetty7 / Mac OSX Lionで実行され、実稼働環境はTomcat 6 / Red HatEnterprise6.1で実行されます。
これが何が起こるかです:ウェブアプリでは、軽量のcmsは、いくつかの書き込み操作を実行した後、書き込み操作が遅延または破棄され始めます。クエリログを読むと、どういうわけか、これらの操作は一度に実行されないことがわかります(コードですべてのトランザクションコミットを明示的に実行した場合でも)が、後で別の書き込み操作によってトリガーされ、突然古い書き込み操作が(単一で)実行されます取引)。それらは必ずしも順番に実行されるとは限らないことに注意してください(おそらくスレッドの問題ですか?)。
エラーは、テスト環境よりも実稼働環境の方が早く発生しますが、最終的には両方で発生します。これは、MySqlデータベースを使用する場合にのみ発生し、コードの単体テストに使用するインメモリH2データベースでは発生しません。私はそれがどういうわけかフォーム送信をキャッシュするTomcatの問題だと思い始めましたが、Jettyテスト環境で問題を再現できたので、代わりにMySQLに焦点を合わせました。
今、私は決してMySQLの専門家ではありませんが、query_cacheシステム変数をいじってみましたが無駄になりました。また、flush = onを設定すると役立つことを期待していましたが、そうではありませんでした。
上記に基づいて私が持っている質問は、これが本当にMySQLの問題なのか、それとも他の場所をチェックする必要があるのかということです。もしそうなら、誰かが何が間違っているのか指摘できますか?たぶんこれはかなり広い質問ですが、その一部が誰かとベルを鳴らしているなら、それは本当に役に立ちます。
前もって感謝します。
編集:
EclipseLinkログの一部を含めました。ご覧のとおり、スレッド…-20,5はすべての作業にUoW…7099を使用しています。その後、何らかの理由でスレッドに切り替わります…-17,5。そのスレッドは新しいUoW…1848を要求します。これまでのところ良好ですが、この抜粋の最後に、ELは実際にpersists操作を…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>