【发布时间】:2014-09-14 20:48:15
【问题描述】:
所以,我一直在努力尝试加快从数据库中删除的过程。我对 Hibernate 比较陌生,我想知道是否可以在一个事务中执行多个操作。
我不太担心交易删除失败,所以回滚所有删除的想法并不困扰我。
如果提供表格描述有帮助,我也可以这样做。我的想法是我必须先删除每个 for 循环中的内容,然后再删除它之外的内容。
我的代码
private void deleteTrackItems() {
Session session = m_databaseConnection.getSession();
Transaction tx = null;
try {
final List<TrackItem> trackItems = loadAllTrackItemByTrackID(
track.getId(), session);
// Deletes all Track Items for the given track
List<Long> trackItemIds = new ArrayList();
for (TrackItem trackItem : trackItems) {
trackItemIds.add(trackItem.getId());
// this is test code 189 through 214
Set<TrackPoint> trackPoints = trackItem.getTrackPoints();
for (TrackPoint trackPoint : trackPoints) {
// load track
final List<TrackPointDetail> trackPointDetails = loadAllTrackPointDetailByTrackID(
trackPoint.getId(), session);
for (TrackPointDetail trackPointDetail : trackPointDetails) {
// delete track point details
deleteObject(trackPointDetail, session);
}
// delete track point
deleteObject(trackPoint, session);
}
// get the track informations
final Set<TrackInformation> trackInformations = trackItem
.getTrackInformations();
// for each track information
for (TrackInformation trackInformation : trackInformations) {
deleteTrackInformation(trackInformation, session);
}
deleteObject(trackItem, session);
}
}
catch (Exception ex) {
System.out.println(ex);
tx.rollback();
}
finally {
if (session != null) {
session.close();
}
}
}
/**
* @param p_objectToDelete The object to delete
* @param p_session the hibernate session
* @return Returns the {@link Runnable}
*/
protected void deleteObject(Object p_objectToDelete, final Session p_session) {
// get the transaction
final Transaction transaction = p_session.getTransaction();
try {
LOGGER.info("Deleting object: " + p_objectToDelete.getClass());
transaction.begin();
p_session.delete(p_objectToDelete);
transaction.commit();
LOGGER.info("Deleted object: " + p_objectToDelete.getClass());
}
catch (Exception exception) {
transaction.rollback();
LOGGER.error(exception);
}
}
因为这些操作中的每一个都在每次删除后执行提交,所以目前我想知道是否可以在更多的批量操作中执行此操作。
我正在考虑做的是将我的提交从我的 deleteObject 函数中拉出来,并将它放在一个对每个对象调用 delete 的 for 循环的末尾。
所以
final Transaction tx = session.getTransaction();
transaction.begin();
try{
for(Object object : objects){
session.delete(object);
}
tx.commit();
}catch(Exception ex){
System.out.println(ex);
tx.rollback();
}
我的另一个批量删除解决方案是使用休眠 SQLQuery,我只需将每个对象的 id 存储在一个列表中,然后在一个查询中以这种方式进行批量删除。但是,我觉得当我在 (?,?,?,?,?) 列表中查询 where id 时,由于序列扫描需要更多时间。
我觉得应该有一种简单的方法可以使用 hibernate session.delete() 进行批量删除。任何想法都非常感谢。
【问题讨论】:
-
你有时间吗?我非常怀疑这种查询方法可能比上面的 N+1 查询策略花费更长的时间。
标签: java hibernate jpa session transactions