4

私はこの奇妙な問題に直面しています。Win XP のマシンでコーディングしてから、すべてのコードを Mac OS X マシンに移動しています。XPマシンのjarを使用して実行します。私はJavaでコーディングしており、データベース処理に休止状態を使用しています。

インクリメントジェネレータークラスを使用してキーが生成されている間、どういうわけか1行を挿入できません。Macでもネイティブですが同じエラーを試しました。

これがデバッグモードです。これで、キー違反としてエラーが発生することがわかりましたが、WinXP では同じことは発生しません。コードを実行する前にデータベースを切り捨てます。それらはMacのジェネレータークラスの依存関係だと思います。それとも他の瓶?

そして、ここにいくつかの詳細があります:

  • Mac OS X 10.5 (x86_64)
  • MYSQL 5.1.35 コミュニティ サーバー
  • mysql-connector-java-5.1.7-bin.jar JDBC ドライバー
  • Java(TM) 2 ランタイム環境、標準版 (ビルド 1.5.0_16-b06-284)
  • Java HotSpot(TM) Client VM (ビルド 1.5.0_16-133、混合モード、共有)

お知らせ下さい

2009-06-20 18:43:01,230 DEBUG [org.hibernate.type.IntegerType] - binding '11266' to parameter: 2
2009-06-20 18:43:01,230 DEBUG [org.hibernate.type.IntegerType] - binding '332' to parameter: 3
2009-06-20 18:43:01,281 DEBUG [org.hibernate.type.IntegerType] - binding '6' to parameter: 4
2009-06-20 18:43:01,281 DEBUG [org.hibernate.persister.entity.AbstractEntityPersister] - Inserting entity: [org.joshua.hibernate.dto.Pagedatecounts#289]
2009-06-20 18:43:01,281 DEBUG [org.hibernate.jdbc.AbstractBatcher] - Executing batch size: 1
2009-06-20 18:43:01,288 DEBUG [org.hibernate.jdbc.AbstractBatcher] - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2009-06-20 18:43:01,288 DEBUG [org.hibernate.jdbc.AbstractBatcher] - closing statement
2009-06-20 18:43:01,289 DEBUG [org.hibernate.util.JDBCExceptionReporter] - Could not execute JDBC batch update [insert into wiki.page (langId, titleId, totalCounts, id) values (?, ?, ?, ?)]
java.sql.BatchUpdateException: Duplicate entry '1-11266' for key 'Page_lang_title'
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1693)
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1108)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2224)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.joshua.hibernate.dao.PageDAO.batchSave(PageDAO.java:70)
    at org.joshua.businesservice.PageServiceImpl.savePageDateCountBatch(PageServiceImpl.java:61)
    at org.joshua.wikidumps.DumpHandler.endElement(DumpHandler.java:192)
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:375)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:176)
    at org.joshua.wikidumps.PagesByNumberOfRecentEdits.execute(PagesByNumberOfRecentEdits.java:107)
    at org.joshua.wikidumps.PagesByNumberOfRecentEdits_ur.main(PagesByNumberOfRecentEdits_ur.java:19)
2009-06-20 18:43:01,290 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 1062, SQLState: 23000
2009-06-20 18:43:01,290 ERROR [org.hibernate.util.JDBCExceptionReporter] - Duplicate entry '1-11266' for key 'Page_lang_title'
2009-06-20 18:43:01,290 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
4

2 に答える 2

1

先に進むことはほとんどありませんが、これは私がそれで作ることができるものです:

  1. 違反している一意のキーは、タイトルと言語の列の組み合わせキーです。(名前(Page_lang_title、lang_idとtitle_idは列名)と、スタックトレースに表示されるキーの値(1-11266、実際には2つの値の組み合わせ)から判断します)。
  2. ウィキページのページを維持する(リクエスト?)カウント。もちろん、複数のスレッド(リクエスト)が同時に同じページにアクセスしているため、これは同時実行の問題が発生しやすくなります。
  3. おそらくバッチ更新(または何か)を実行していて、同じ<lang_id、title_id>の組み合わせを2回ヒットしました。あなたのロジックは「fromPagewherepage_id =?and lang_id =?」のようなものです。同じトランザクションでバッチを実行し、トランザクション後の同期にhibernateを使用しているため、テーブルへの挿入はトランザクションをコミットした後にのみ処理され、lang_idとpage_idの同じ組み合わせを2回挿入しようとします。

今、あなたができることがいくつかあります:

  1. Hibernateのモードが正しく機能していることを確認してください。これにより、このテーブルでクエリが実行される直前にAUTO_FLUSH新しいエンティティを挿入する必要がある場合は常にセッションがフラッシュされます。これを意図したとおりに機能させるには、Hibernateが開始されたトランザクションを認識していることを確認する必要があります。
  2. トランザクションごとに作成したPagedatecountの独自のキャッシュを維持し、Hibernateでデータベースをチェックする前にそれをクエリします。

考えてみてください。Pagedatecountエンティティに日付列がありませんか?挿入されていないようです。

于 2009-06-22T18:11:56.157 に答える
1

私は同じ問題に遭遇します。すでに解決済みかどうかはわかりません。とにかく、私の場合、MySQL がどのようにテーブルを作成し、テーブル名の比較を実行するかが問題でした。MacOsX では、「lower_case_table_names」MySQL 変数を 1 (デフォルトでは 0) に設定する必要がありました。これは、InnoDB を使用する場合の推奨値です。そして、これは私の問題を解決しました(あなたと同じように、Hibernateが自動生成されたIDを取得していないように見えました)。

これが役に立てば幸いです、リカルド。

于 2011-05-05T12:09:21.430 に答える