【问题标题】:Parallel resolve of Hibernate UserType when returning via criteria.list()通过 criteria.list() 返回时并行解析 Hibernate UserType
【发布时间】:2011-12-14 13:38:15
【问题描述】:

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

将 JAXB 注释对象解组/编组为输入 XML 列(在 DB2 中)的字符串数据。在字符串和 Pojos 之间滚动数据需要时间......大约 7 毫秒(有或没有验证)。问题是,如果我有一个包含 20 个奇数对象的结果集,则数据的滚动是按顺序完成的。 20 * 7ms 是 140ms,这对于从表中拉出 20 个元素来说已经很多了。使用 Hibernate Criteria 和 list 方法返回数据。

是否可以并行处理 Hibernate 从 JDBC 管道获取的结果?这样 7 毫秒就分布在并行处理中,从而将我的响应时间缩短到 JAXB 需要转换的时间?

通过谷歌搜索过,但没有看到任何东西......

【问题讨论】:

    标签: hibernate jaxb criteria


    【解决方案1】:

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

    毫无疑问,您会遇到一些关于时间的有趣问题(与所有并发一样),而且实现 UserType 接口的其余部分(即 equals、hashCode 等)变得更加困难。

    【讨论】:

    • 必须保证数据从 Hibernate 移交给用户代码时是完整的。因此,对于单个期货,直接的问题是同步响应,结果集中的所有对象都具有有效的属性(即在我的情况下,解析字符串作为 JAXB 对象)。
    【解决方案2】:

    另一种替代解决方案是放弃用户类型并将属性建模为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&lt;That&gt; 的 UserType 更平易近人

    请注意,当您获得 Thing 列表时,您首先需要在实际尝试访问这些值之前对对象进行初始化:

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

    这有几个问题。

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

    【讨论】:

    • 以前没有使用过完成服务,但值得一看,关于“顺序”,查询对象的列表保持有序。如果我回顾一下您的建议:跳过将数据(字符串)发送到属性中的 UserType(这应该很快,因此可以加快 Hiberante 并且不需要使用 Hibernate 进行欺骗),那么 ExecutorService 或 CompletionService 会执行实际的编组/解组步骤单例静态。将进行测试以确保调用者不会受到处理成本的影响。
    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多