2012-03-20 3 views
2

GenericServiceを拡張するATGクラスを介して複数のレコードを更新しようとしています。 しかし、私はロードブロッキングに対して走っています。 キャッシュされたオブジェクトにすべてのアイテム/行を追加したままで、item.add()を使用して単一のコマンドをテーブルと同期させて、複数の挿入クエリを実行するにはどうすればよいですか?ATGリポジトリAPI

サンプルコード最初の部分は、挿入(強大な有用起こる前に、誰もが本ずつをループすることなく、テーブル内のすべての行をクリアし、削除する方法を知っている場合は、テーブル内の行をクリアすることである

1)。

MutableRepository repo = (MutableRepository) feedRepository; 
    RepositoryView view = null; 

    try{ 
     view = getFeedRepository().getView(getFeedRepositoryFeedDataDescriptorName()); 
     RepositoryItem[] items = null; 
     if(view != null){   
      QueryBuilder qb = view.getQueryBuilder(); 
      Query getFeedsQuery = qb.createUnconstrainedQuery(); 
      items = view.executeQuery(getFeedsQuery); 
     } 
     if(items != null && items.length>0){ 
      // remove all items in the repository 
      for(RepositoryItem item :items){ 
       repo.removeItem(item.getRepositoryId(), getFeedRepositoryFeedDataDescriptorName()); 
      } 
     } 



     for(RSSFeedObject rfo : feedEntries){ 
      MutableRepositoryItem feedItem = repo.createItem(getFeedRepositoryFeedDataDescriptorName()); 

      feedItem.setPropertyValue(DB_COL_AUTHOR, rfo.getAuthor()); 
      feedItem.setPropertyValue(DB_COL_FEEDURL, rfo.getFeedUrl()); 
      feedItem.setPropertyValue(DB_COL_TITLE, rfo.getTitle()); 
      feedItem.setPropertyValue(DB_COL_FEEDURL, rfo.getPublishedDate()); 

      RepositoryItem item = repo.addItem(feedItem) ; 
     } 

答えて

4

私はあなたの質問を解釈する方法は、あなたがあなたのリポジトリに複数のリポジトリ項目を追加したいということですが、あなたは、データベースレベルでかなり効率的にそれをやってみたいです。

TransactionManager tm = ... 
TransactionDemarcation td = new TransactionDemarcation(); 
try { 
    try { 
    td.begin (tm); 

    ... do repository item work ... 
    } 
    finally { 
    td.end(); 
    } 
} 
catch (TransactionDemarcationException exc) { 
    ... handle the exception ... 
} 

あなたの例では、SQLリポジトリを使用していると仮定すると、SQLのINSERT文はaddItemへの各呼び出しの後に発行されますが、/ IFまでコミットされません。私はあなたが、Java Transaction API as recommended in the ATG documentationを利用するので、同じよう示唆しますトランザクションは正常に完了します。

0

ATGでは、1つのSQL文で複数のレコードを削除することはできません。 @chrisjleuが示唆するようにトランザクションを使用することはできますが、DELETE WHERE ID IN {"1", "2", ...}に相当する方法はありません。コードが正しいように見えます。

ATGリポジトリを使用してストアドプロシージャを呼び出したり、カスタムSQLを実行したりすることは可能ですが、移植性/保守上の理由から一般的に推奨されていません。そうした場合は、アイテム/クエリキャッシュの適切な部分を手動でフラッシュする必要もあります。

関連する問題