2011-12-14 55 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