通过criteria.list()返回时并行解析Hibernate UserType

时间:2011-12-14 13:38:15

标签: hibernate jaxb criteria

在Hibernate中构建一个UserType .....

解组/解析JAXB将对象注释为字符串数据,这些数据被提供给XML列(在DB2内部)。在字符串和Pojos之间滚动数据需要时间......大约7ms(有或没有验证)。问题是如果我有20个奇数对象的结果集,则按顺序完成数据滚动。 20 * 7ms是一个140ms,这只是从表中提取20个元素。使用Hibernate Criteria和list方法返回数据。

有没有办法处理Hibernate并行从JDBC管道获取的结果?这样7ms是通过并行处理分配的,减少了我的响应时间,直到JAXB需要转换的时间?

已经通过Google搜索过但没有看到任何内容......

2 个答案:

答案 0 :(得分:0)

有趣的问题。我的第一个想法是尝试将其建模为Future<Thing>。您的UserType可以向Executor提交任务并返回Future

毫无疑问,你会有一些关于时序的有趣问题(和所有并发一样),加上实现UserType接口的其余部分(即equals,hashCode等)变得更加困难。

答案 1 :(得分: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;
    }
}   

认为这可能比User Future<That>

更平易近人

请注意,当您获得Thing的列表时,首先需要在实际尝试访问值之前填充对象:

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

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

这有几个问题。

  1. 执行人没有明确的生命周期。即如何关闭
  2. 无法保证列表中的第一项是第一个返回结果的项目,可能使用ExecutorCompletationService会提供更好的解决方案