0

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>
4

3 に答える 3

1

これが MySQL データベースの問題ではないかと真剣に疑っています。むしろ、トランザクション マネージャーとの EclipseLink のやり取りに問題があると思われます。外部トランザクション マネージャー (JTA または OTS) を使用しているかどうかについては言及していません。

UnitOfWorkcommitメソッドが呼び出されると、データベースに変更が適用されるはずです。UnitOfWork が親 UnitOfWork の子でない限り、これは当てはまります。子 UnitOfWork の場合、commitメソッドは変更をデータベースに適用しません。代わりに、すべての変更をその親 UnitOfWork に渡します。

それが私のコードであれば、ネストされた作業単位を扱っていないことを確認するために調べます。acquireUnitOfWork メソッドの呼び出しが、別の UnitOfWork オブジェクトではなく、セッション オブジェクトで行われていることを確認します。

于 2012-06-27T14:48:10.343 に答える
0

EntityManagers をどのように取得し、トランザクションを開始/コミットしていますか? 新しい EntityManager を取得し、それを使用して、変更を加えたトランザクションではなく、トランザクションを開始/コミットしているようです。

于 2012-07-10T18:55:41.760 に答える
0

EclipseLink でのロギングを有効にして、ログを調べます。トランザクションはログに正しく表示されますか? 書き込みはトランザクションの一部ですか?

どのタイプの接続プーリングとトランザクション制御を使用していますか? persistence.xml を含めます。

EntityManagers をどのように作成していますか (JPA を使用していると思いますか?)。同じ EntityManager を異なるスレッド/リクエストで共有しているようです。各スレッド/リクエスト/トランザクションには、独自の EntityManager が必要です。

于 2012-07-05T13:56:40.727 に答える