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