Java Hibernate:JDBC与Hibernate在大容量记录中的性能

Java Hibernate:JDBC与Hibernate在大容量记录中的性能,java,performance,hibernate,jdbc,orm,Java,Performance,Hibernate,Jdbc,Orm,说明:装船操作会话表示一个特定的时间段,它属于某个装船ID。可能有许多LoadoutOperatingSession对象具有相同的loadoutId validateForOverlappings(model, fetchLoadoutOperatingSessionsList(model)); private <T extends Comparable> void validateForOverlappings(T obj, List<T> objList){

说明
装船操作会话
表示一个特定的时间段,它属于某个
装船ID
。可能有许多
LoadoutOperatingSession
对象具有相同的
loadoutId

validateForOverlappings(model, fetchLoadoutOperatingSessionsList(model));

private <T extends Comparable> void validateForOverlappings(T obj, List<T> objList){        

    for (Comparable c : objList) {
        if(obj.compareTo((T) c) == 0){
            throw new IllegalArgumentException("Overlapping Sessions are not allowed!");
        }
    }
}
在插入新会话之前,必须检查重叠

下面是我设计的模型对象

public class LoadoutOperatingSession extends Entity implements Serializable, Comparable<LoadoutOperatingSession>{

private Long loadoutId;
private Date effectiveFromDate;
private Date effectiveToDate;
private String sessionStartTime;
private String sessionEndTime;
private String isSchedule;


/**
 *  Compares the given session with the current one and return 1 if this session is greater than the given session,
 * -1 if the this session is less than the given session and
 *  0 is the sessions are overlapping.
 *  
 * @param  session1
 *         First Session
 *         
 * @param session
 *         Second Session
 */

@Override
public int compareTo(LoadoutOperatingSession session) {

    if (session.getEffectiveToDate().getTime() < this.getEffectiveFromDate().getTime()) {
        return 1;
    } else if (this.getEffectiveToDate().getTime() < session.getEffectiveFromDate().getTime()) {
        return -1;
    } else if (this.getEffectiveFromDate().getTime() == session.getEffectiveFromDate().getTime()) {

        int thisStartTime = Integer.parseInt(this.getSessionStartTime());
        int thisEndTime = Integer.parseInt(this.getSessionEndTime());

        int sessionStartTime = Integer.parseInt(session.getSessionStartTime());
        int sessionEndTime = Integer.parseInt(session.getSessionEndTime());

        if (thisEndTime < sessionStartTime) {
            return -1;
        } else if (thisStartTime > sessionEndTime) {
            return 1;
        }
        return 0;
    }
    return 0;
}
问题:同样的验证可以通过执行JDBC查询并计算重叠会话的数量来完成

它会比上面提到的java解决方案更高效吗


请证明。

使用此SQL语句,可以对数据库级别执行检查:

select top 1 a.id 
from LoadoutOperatingSession a, LoadoutOperatingSession b 
where a.FROM_DATE <= b.TO_DATE and b.FROM_DATE <= a.TO_DATE
选择前1个a.id
从装船操作会话a到装船操作会话b

感谢您分享您的知识。实际上,这是一个后端验证,来自异常的消息将被提取并显示给用户。用户将不会看到任何异常详细信息。请解释一下它是否有问题。好的,从技术上来说,你的验证没有问题。这更像是一个常识问题——您允许用户保存重叠的会话。但是,在检索会话时,如果会话不重叠,则会进行后端验证,如果重叠,则会导致异常。防止保存重叠会话不是更好吗?这是一个很好的参考:只有在存在重叠的情况下才会抛出异常,并且在保存会话之前对其进行了检查。将使用已保存的会话检查当前会话。您的建议是,如果发生重叠,不要抛出异常,而只是避免保存?请解释一下。啊哈,现在我明白了。这取决于您的用例应该发生什么,但在这种情况下,异常似乎是正确的。另外,我的回答是不准确的,因为DB级别的检查是在没有您试图插入的记录的情况下完成的。我想我的问题还不清楚。我已经编辑了这个问题。谢谢你分享你的知识。
select top 1 a.id 
from LoadoutOperatingSession a 
where a.FROM_DATE <= :insertedStartDate and a.TO_DATE >= :insertedEndDate