在Hibernate中构建一个UserType .....
解组/解析JAXB将对象注释为字符串数据,这些数据被提供给XML列(在DB2内部)。在字符串和Pojos之间滚动数据需要时间......大约7ms(有或没有验证)。问题是如果我有20个奇数对象的结果集,则按顺序完成数据滚动。 20 * 7ms是一个140ms,这只是从表中提取20个元素。使用Hibernate Criteria和list方法返回数据。
有没有办法处理Hibernate并行从JDBC管道获取的结果?这样7ms是通过并行处理分配的,减少了我的响应时间,直到JAXB需要转换的时间?
已经通过Google搜索过但没有看到任何内容......
答案 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();
}
这有几个问题。
ExecutorCompletationService
会提供更好的解决方案