2011-12-14 37 views
0

內置休眠一個UserType .....並行決心()

即解組/執法官JAXB標註對象成被饋送到一個XML列字符串數據(DB2內)。在字符串和Pojos之間滾動數據需要大約7ms的時間(有或沒有驗證)。問題是,如果我有一個包含20個奇數對象的結果集,則數據滾動將按順序進行。 20 * 7ms是一個140ms,這很適合從桌子上拉出20個元素。使用Hibernate Criteria和list方法返回數據。

無論如何處理Hibernate從JDBC管道並行獲得的結果嗎?因此,7ms是通過並行處理進行分佈的,從而將響應時間減少到JAXB需要轉換的時間?

已經通過谷歌搜索,但沒有看到任何東西...

回答

0

有趣的問題。我的第一個想法是嘗試將它建模爲Future<Thing>。您的UserType可以將任務提交到Executor並返回Future

毫無疑問,你會有一些有關計時的問題(與所有併發一樣),再加上實現其餘的UserType接口(即equals,hashCode等)變得更加困難。

+0

數據是完好的擔保,當從Hibernate切換到用戶代碼是必須的。因此,對於個體期貨而言,直接問題是同步響應,即結果集中的所有對象都具有有效屬性(即,在我的情況下,解析字符串是JAXB對象)。 – 2011-12-15 06:43:35

0

另一種替代的辦法是放棄用戶類型和屬性模型作爲InputStream

public Thing { 
    // use field access level 
    private InputStream blob; 

    @Tranisent  
    private Future<That> that; 

    private static final ExecutorService executor = ExecutorService.newCachedThreadPool(); 

    public Future<That> getThat(){ 
     if(that == null) { 
      // lazily submit the creation to the executor 
      that = executor.submit(new Callable<That>{/* implement call() */}); 
     } 
     return that; 
    } 
} 

認爲這可能是一點點更平易近人是的Future<That>

注意的用戶類型,當你清單Thing在實際嘗試訪問這些值之前,您首先需要填充對象:

for(Thing thing: listOfThings){ 
    thing.getThat() ; // for side effects 
}           

for(Thing thing: listOfThings){ 
    That that = thing.getThat().get(); 
} 

這有幾個問題。

  1. Executor沒有明確的生命週期。即如何將它被關閉
  2. 沒有保證,在列表中的第一個項目將是第一個返回結果,也許用ExecutorCompletationService將提供更好的解決方案
+0

以前沒有使用完成服務,但值得一看,關於「訂單」查詢對象列表保持秩序。如果我回顧一下你的建議:跳過UserType發送數據(字符串)到一個屬性(這應該是快速的,從而加速Hiberante,而且Hibernate不需要任何欺騙),那麼ExecutorService或CompletionService會執行實際的marshall/unmarshall步驟單身靜態。將進行測試以確保呼叫者不會受到處理成本的影響。 – 2011-12-15 07:39:12