Java OpenJPA中的自动事务
我有一个班级,地点。位置包含一个边界点对象列表,但它可以是一个巨大的列表(20000个并非不可能)。这方面的表格是位置和边界点 我最初通过从ESRI形状文件导入来填充位置。这里有一个代码片段:Java OpenJPA中的自动事务,java,openjpa,Java,Openjpa,我有一个班级,地点。位置包含一个边界点对象列表,但它可以是一个巨大的列表(20000个并非不可能)。这方面的表格是位置和边界点 我最初通过从ESRI形状文件导入来填充位置。这里有一个代码片段: try { while (featureIterator.hasNext()) { Location location = new Location(); SimpleFeatureImpl feat
try {
while (featureIterator.hasNext()) {
Location location = new Location();
SimpleFeatureImpl feature = (SimpleFeatureImpl) featureIterator.next();
// set the information in location based on stuff in the feature, lets me clean up this
// method a bit
setLocationInfo(location, feature);
List<BorderPoint> borderPointList = getBorderPoints(feature, location);
//saveBorderPoints(location, feature);
location.setBorderPointList(borderPointList);
try {
locationRepository.persist(location);
} catch (RepositoryException e) {
throw new ServiceException("processShapefile() threw RepositoryException", e);
}
}
} finally {
featureIterator.close();
}
试试看{
while(featureIterator.hasNext()){
位置=新位置();
SimpleFeatureImpl feature=(SimpleFeatureImpl)featureIterator.next();
//根据功能中的内容在位置中设置信息,让我来清理一下
//方法一点
setLocationInfo(位置、特征);
List borderPointList=getBorderPoints(特征、位置);
//保存边界点(位置、特征);
location.setBorderPointList(borderPointList);
试一试{
locationRepository.persist(位置);
}捕获(存储异常e){
抛出新的ServiceException(“processShapefile()抛出了RepositoryException”,e);
}
}
}最后{
featureIterator.close();
}
由于列表中有这么多边界点对象,但我只是通过调用Location对象上的persist来保存它们,我是否可以自动设置某种类型的批大小来持久化边界点?如果使用JTA,您可能需要自己将导入分解成批。但是,您可能需要检查是否确实必须将每个点存储为一行
我的同事试图保存一个包含许多点的图表,在性能不佳后,他们分析了使用情况,意识到他们总是加载所有点。因此,他们最终将所有点序列化为一个blob,性能得到了巨大的提高。我不知道OpenJPA,但我经常使用Hibernate。您可能必须自己控制事务大小。如果您稍微更改代码,这应该很容易:
这就是我所担心的答案,但我一直抱着希望。我自己在Hibernate方面也有一些经验,它似乎比JPA更易于配置,尤其是在Spring下。