2011年9月28日

[mysql 15634] Re: データ更新時のエラーについて

こんにちは、平塚です。

On Tue, 27 Sep 2011 20:31:51 +0900
Kenji Funasaki <kenji.funasaki@xxxxx> wrote:

> Caused by: <openjpa-2.0.1-r422266:989424 fatal store error>
> org.apache.openjpa.persistence.RollbackException: Streaming result set
> com.mysql.jdbc.RowDataDynamic@xxxxx is still active. No statements

> may be issued when any
> streaming result sets are open and in use on a given connection.

OpenJPAとMySQLの組み合わせにはいくつか制限事項があるそうで、
以下のページの下から2つ目の事象にヒットしているように見えます。
http://openjpa.apache.org/docs/latest/dbsupport_mysql.html

When using large result sets with MySQL there are a number of
documented limitations. Please read the section titled "ResultSet"
in the "MySQL JDBC API Implementation Notes". The net effect of these
limitations is that you will have to read all of the rows of a result
set (or close the connection) before you can issue any other queries
on the connection, or an exception will be thrown. Setting
openjpa.FetchBatchSize to any value greater than zero will enable
streaming result sets.


発生するパターンとして、

・persistence.xmlにおいてFetchBatchSizeが1以上
<property name="openjpa.FetchBatchSize" value="10" />

・多くのデータを返すクエリについて、1つ目のクエリで
結果セットを全て処理せずに2つ目のクエリを投げる
List l = q.getResultList();
l = q.getResultList();

で、再現しました。

Exception in thread "main" <openjpa-2.0.1-r422266:989424 nonfatal
general error> org.apache.openjpa.persistence.PersistenceException:
Streaming result set com.mysql.jdbc.RowDataDynamic@xxxxx is still
active. No statements may be issued when any streaming result sets
are open and in use on a given connection. Ensure that you have called
.close() on any active streaming result sets before attemptin
g more queries. {prepstmnt 2592387 SELECT t0.id, t0.name FROM Item t0}
[code=0, state=null]
FailedObject: SELECT i.id, i.name FROM Item i [java.lang.String]
at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4832)
at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4792)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:118)
at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:70)


更新に失敗するとのことですが、実際には
更新の1つ前のクエリに原因があるのではないかと思います。
以下のような対処方法があります。

・結果セットを最後まで処理する
l.get(l.size() - 1); // すごい適当ですが

・FetchBatchSizeを使わない
<property name="openjpa.FetchBatchSize" value="-1" />


よろしくお願いします。

--
平塚貞夫 hiratsuka.sadao@xxxxx


投稿者 xml-rpc : 2011年9月28日 11:04
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/106526
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。