12

分割されたpostgresqlテーブルで休止状態を介してバッチ挿入するための解決策はありますか? 現在、このようなエラーが発生しています...

ERROR org.hibernate.jdbc.AbstractBatcher - Exception executing batch:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
   at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
   at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
   at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)....

私はこのリンクhttp://lists.jboss.org/pipermail/hibernate-dev/2007-October/002771.htmlを見つけましたが、この問題が解決されたのか、それともどのように回避できるのか、ウェブ上のどこにも見つかりません

4

6 に答える 6

4

hibernate.jdbc.factory_class プロパティを設定して、カスタム Batcher を使用してみてください。hibernate がバッチ操作の更新カウントをチェックしないようにすると、問題が解決する可能性があります。カスタム Batcher でクラス BatchingBatcher を拡張し、メソッド doExecuteBatch(...) を次のようにオーバーライドすることで、問題を解決できます。

    @Override
    protected void doExecuteBatch(PreparedStatement ps) throws SQLException, HibernateException {
        if ( batchSize == 0 ) {
            log.debug( "no batched statements to execute" );
        }
        else {
            if ( log.isDebugEnabled() ) {
                log.debug( "Executing batch size: " + batchSize );
            }

            try {
//              checkRowCounts( ps.executeBatch(), ps );
                ps.executeBatch();
            }
            catch (RuntimeException re) {
                log.error( "Exception executing batch: ", re );
                throw re;
            }
            finally {
                batchSize = 0;
            }

        }

    }

新しいメソッドは、準備されたステートメントの実行結果をチェックしないことに注意してください。この変更を行うと、休止状態に予期しない方法で影響する可能性がある (または影響しない可能性がある) ことに注意してください。

于 2008-09-18T04:31:51.630 に答える
2

thnx!それはトリックを行いました、これまでのところ問題は発生しませんでした:). ... 1つのこと...クラスを実装して、次のようにファイルにBatcherFactory入れなければなりませんでした:persistence.xml

property name="hibernate.jdbc.factory_class" value="path.to.my.batcher.factory.implementation"

そのファクトリから、上記のコードでバッチャーの実装を呼び出しました

ps ハイバネート コア 3.2.6 GA

もう一度ありがとう

于 2008-09-18T12:22:02.030 に答える
2

彼らは、パーティション化されたテーブルまたは @SQLInsert 注釈で 2 つのトリガーを使用すると言います: http://www.redhat.com/f/pdf/jbw/jmlodgenski_940_scaling_hibernate.pdf 21-26 ページ (文字列を指定する @SQLInsert についても言及しています)方法)。

マスターの余分な行を削除するアフタートリガーの例を次に示します: https://gist.github.com/copiousfreetime/59067

于 2010-05-25T14:05:07.503 に答える