2017-10-30 6 views
0

多くのデータベース操作が必要な要件があります。基本的に100,000データ操作をサポートするバルクアップロードです。私は、ファイルを複数の塊に分割し、複数のスレッドに供給します。私が達成したいのは、すべてのスレッドが成功した場合にのみdb操作が成功し、それ以外の場合は操作全体をロールバックする必要があるということです。複数のスレッドによる休止状態の春

私は、人々が複数のスレッドで春の休止状態を使用しないと主張する多くのものを読みました。 Spring SessionFactoryを使用してこれを可能にすることができますか?そうであれば、何が重要であるかを覚えておく必要があります。

+0

バッチ処理されていないデータを保存する場合は、SessionFactoryの代わりにStatelessSessionを使用します.StatuselessSessionがメモリを過負荷にしない主な理由、Hibernateの仕組みを理解する必要があります。 –

答えて

0

最後にこれを解決できました。他人を助けるコードスニペットの共有

これはスレッドレベルでのトランザクションを維持することで実現できます。しかし、これらすべてのスレッド間で共有オブジェクトが必要になります。この共有オブジェクトは、すべてのスレッドのステータスを追跡し、どちらかが失敗した場合に通知します。このスレッドによって障害通知が受信されると、スレッド自体が例外をスローし、トランザクションがロールバックされます。共有クラス内の個々のスレッドで

例コードコードが

@Transactional(rollbackFor = Exception.class) 
public void saveData(Product product, ProductStatusObject productStatusObject) throws Exception { 
    productDao.persist(product); 
    if(product.getId() == 5) { 
     productStatusObject.updateCounter(false); 
    } else { 
     productStatusObject.updateCounter(true); 
    } 
    if(!productStatusObject.getStatus()) { 
     throw new Exception(); 
    } 
} 

コード

private final int totalThreads; 

private int executedThreads = 0; 
private Boolean finalStatus = true; 

public ProductStatusObject(int totalThreads) { 
    this.totalThreads = totalThreads; 
} 

public synchronized void updateCounter(Boolean threadStatus) throws InterruptedException { 
    executedThreads ++; 
    if(!threadStatus) { 
     this.finalStatus = false; 
    } 
    if(totalThreads == executedThreads) { 
     notifyAll(); 
    } else { 
     wait(); 
    } 

} 

public synchronized Boolean getStatus() { 
    return finalStatus; 
} 

スレッドのいずれかが、すべてのスレッドがそのコードをロールバックしますID 5を使用してデータを保存している場合はここで失敗条件があります。それ以外の場合はすべて成功します