原创

Spring BatchSqlUpdate を使用する場合の自動コミット autocommit が true に設定されている場合、バッチは本当に期待どおりに実行されますか?

温馨提示:
本文最后更新于 2024年04月12日,已超过 47 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

これは古いプロジェクトで、データソース用マネージャーを定義する applicationContext.xml ファイルがあり、各メソッドはプロキシを使用します。

Spring の BatchSqlUpdate の使用に残った場合、最大の特典を得るには、少数の方法でこの呼び出しの自動コミットを有効にする必要がありますか?これに関する多くの投稿を読みましたが、それらはすべて、独自の書き込みを作成し、次のように接続を直接使用する例を示しています。autocommit が true に設定されている場合、バッチは本当に期待どおりに実行されますか?

しかし、それを「春のやり方」で行うときについて話している人は見つかりません。接続は無事で autocommit=true になり、これは他のすべてのメソッドに適しています。あるだけで、特定のメソッド/クラスに対して自動コミットを false に設定するメソッドが見つかりません。

詳細は後ほど説明しますが、このために自動コミットを無効にする投稿する必要があるかどうか (他のから聞こえるように)、無効にする場合はどのようにすればよいか知っている人はいますか?

詳細は、applicationContext.xml に次のように記述されています。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource"><ref local="dataSource"/></property>
</bean>

<bean id="userManagerDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager"><ref local="transactionManager"/></property>
    <property name="target"><ref bean="userManagerDAO"/></property>
    <property name="transactionAttributes">
        <props>
            <prop key="get*">PROPAGATION_SUPPORTS</prop>
            <prop key="find*">PROPAGATION_SUPPORTS</prop>
            <prop key="is*">PROPAGATION_SUPPORTS</prop>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

データ ソースは wildflystandalone.xml から取得されます。これはすべてうまくいっていた。現在、バッチ モードの使用に集中しています。 SQL 更新メソッドは次のように (多少簡略化されています)。

protected class UpdateUserUpdate extends SqlUpdate {
  public UpdateUserUpdate(DataSource ds) {
    setDataSource(ds);
    setSql("update whatever.. set value = ?")
    declareParameter(new SqlParameter(Types.VARCHAR));          
    compile();
  }
  public int myupdate(String s) {
    Object[] params = new Object[] { s };
    return update(params);
  }
}

そして、単純に親クラスを BatchSqlUpdate に変更すると、通常に動作します。

protected class UpdateUserUpdateBatch extends BatchSqlUpdate {
...copy as before but now add...
  setBatchSize(1000);
}

しかし、ある程度の方法で自動コミットを有効にできれば、もっと多くのことが理解できるでしょうか?

困った場合、メソッドを作成し、ついでに配列を入力し、データソースから新しい接続を取得して、次のように PreparedStatement を使用する方が速いです。

con = dataSource.getConnection();
con.setAutoCommit(false);
PreparedStatement pstmt = con.prepareStatement(sql);
do my add batch/executebatch in a 1000 loop...
pstmt.executeBatch();
con.commit();
con.setAutoCommit(false);

これは春の方法ではありませんが、自動コミットを無効にするため高速になったのでお願い、危険 BatchSqlUpdate で自動コミットを無効にすることができますか?

ありがとう!

正文到此结束
热门推荐
本文目录