【问题标题】:Hibernate : JDBC Vs Hibernate Performance in bulk recordsHibernate:批量记录中的 JDBC 与 Hibernate 性能
【发布时间】:2015-08-05 11:52:51
【问题描述】:

描述LoadoutOperatingSession代表一个特定的时间段,属于某个loadoutId。可以有很多LoadoutOperatingSession对象具有相同的loadoutId

在插入新会话之前,必须检查是否存在重叠。

下面是我设计的模型对象。

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;
}

}

假设有很多 LoadoutOperatingSession 对象具有相同的 loadoutId。 为了检查重叠,我获取了所有LoadoutOperatingSession 对象并使用compareTo 方法相互比较。

注意:此检查在持久化当前会话之前完成。

fetchLoadoutOperatingSessionsList 方法将返回给定loadoutId 的所有LoadoutOperatingSession 对象

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!");
        }
    }
}

问题:同样的验证可以通过执行 JDBC 查询并计算重叠会话数来完成。

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

请说明理由。

【问题讨论】:

    标签: java performance hibernate jdbc orm


    【解决方案1】:

    使用此 SQL 语句可以在 DB 级别执行检查:

    select top 1 a.id 
    from LoadoutOperatingSession a, LoadoutOperatingSession b 
    where a.FROM_DATE <= b.TO_DATE and b.FROM_DATE <= a.TO_DATE
    

    为什么更快:

    • 与应用程序级别相同。 SQL 返回第一条重叠记录
    • 但是,您不是从数据库返回记录列表,而是简单的整数 - 没有序列化开销

    但是,如果您在验证从数据库读取的记录后在应用程序级别抛出 IllegalArgument,我认为还有其他问题。我不知道您的用例,但防止保存此类记录会更安全

    编辑

    我之前的回答不正确。这是在数据库级别进行的平等检查

    select top 1 a.id 
    from LoadoutOperatingSession a 
    where a.FROM_DATE <= :insertedStartDate and a.TO_DATE >= :insertedEndDate
    

    【讨论】:

    • 感谢您分享您的知识。实际上这是一个后端验证,来自异常的消息将被提取并显示给用户。用户不会看到任何异常详细信息。如果有问题请解释一下。
    • 好的,从技术上讲,您的验证没有问题。这更像是一个常识问题 - 您允许用户保存重叠会话。但是,在检索会话时,如果它们不重叠,则会进行后端验证,如果重叠则会导致异常。防止保存重叠会话不是更好吗?这是一个很好的参考:stackoverflow.com/questions/4023160/…
    • 只有在存在重叠时才会抛出异常,并且在保存会话之前对其进行检查。当前会话将与已保存的会话一起检查。您的建议是不要抛出异常,如果发生重叠则避免保存?请解释一下。
    • 啊哈,现在我明白了。这取决于您的用例应该发生什么,但在这种情况下,异常似乎是正确的。另外,我的回答是不准确的,因为数据库级别的检查是在没有您尝试插入的记录的情况下完成的。我会调整查询
    • 我想我的问题还不清楚。我已经编辑了这个问题。感谢您分享您的知识。
    猜你喜欢
    • 2013-01-11
    • 2012-08-29
    • 2019-06-19
    • 2017-07-23
    • 2013-07-23
    • 2014-02-20
    • 2020-10-18
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多