Java 基于海量数据的服务器端排序

Java 基于海量数据的服务器端排序,java,sql,sorting,dojo,Java,Sql,Sorting,Dojo,到目前为止,我们正在DojoDataGrid上提供客户端排序。现在我们需要增强服务器端排序,这意味着排序应该应用于网格上的所有页面。我们有4个表连接在主表上,到目前为止有2个lac记录,并且可能会增加。当执行SQL时,将所有记录提取到我的java代码需要5-8分钟的时间,我需要对它们应用一些计算,我使用比较器提供自定义排序。我们有每个比较器来表示每个列 我担心的是如何在短时间内将整个数据传输到服务层代码?有没有办法通过数据源配置来提高执行速度 return new Comparator<Q

到目前为止,我们正在DojoDataGrid上提供客户端排序。现在我们需要增强服务器端排序,这意味着排序应该应用于网格上的所有页面。我们有4个表连接在主表上,到目前为止有2个lac记录,并且可能会增加。当执行SQL时,将所有记录提取到我的java代码需要5-8分钟的时间,我需要对它们应用一些计算,我使用比较器提供自定义排序。我们有每个比较器来表示每个列

我担心的是如何在短时间内将整个数据传输到服务层代码?有没有办法通过数据源配置来提高执行速度

return new Comparator<QueryHS>() {

                public int compare(QueryHS object1, QueryHS object2) {
                    int tatAbs = object1.getTatNb().intValue() - object1.getExternalUnresolvedMins().intValue();
                    String negative = "";
                    if (tatAbs < 0) {
                        negative = "-";
                    }
                    String tatAbsStr = negative + FormatUtil.pad0(String.valueOf(Math.abs(tatAbs / 60)), 2) + ":"
                        + FormatUtil.pad0(String.valueOf(Math.abs(tatAbs % 60)), 2);
         //           object1.setTatNb(tatAbs);
                    object1.setAbsTat(tatAbsStr.trim());

                    int tatAbs2 = object2.getTatNb().intValue() - object2.getExternalUnresolvedMins().intValue();
                    negative = "";
                    if (tatAbs2 < 0) {
                        negative = "-";
                    }
                    String tatAbsStr2 = negative + FormatUtil.pad0(String.valueOf(Math.abs(tatAbs2 / 60)), 2) + ":"
                        + FormatUtil.pad0(String.valueOf(Math.abs(tatAbs2 % 60)), 2);

           //         object2.setTatNb(tatAbs2);
                    object2.setAbsTat(tatAbsStr2.trim());
                    if(tatAbs > tatAbs2)
                        return 1;
                    if(tatAbs < tatAbs2)
                        return -1;
                    return 0;
                }
            };
返回新的比较器(){
公共int比较(QueryHS对象1、QueryHS对象2){
int-tatAbs=object1.getTatNb().intValue()-object1.getexternalunsolvedmins().intValue();
字符串负=”;
如果(tatAbs<0){
负=“-”;
}
String tatAbsStr=negative+FormatUtil.pad0(String.valueOf(Math.abs(tatAbs/60)),2)+“:”
+FormatUtil.pad0(String.valueOf(Math.abs(tatAbs%60)),2);
//目标1.setTatNb(tatAbs);
object1.setAbsat(tatAbssr.trim());
int-tatAbs2=object2.getatnb().intValue()-object2.getexternalunsolvedmins().intValue();
负=”;
如果(tatAbs2<0){
负=“-”;
}
String tatAbsStr2=negative+FormatUtil.pad0(String.valueOf(Math.abs(tatAbs2/60)),2)+“:”
+FormatUtil.pad0(String.valueOf(Math.abs(tatAbs2%60)),2);
//object2.setTatNb(tatAbs2);
object2.setAbsat(tatAbsStr2.trim());
如果(tatAbs>tatAbs2)
返回1;
if(tatAbs
您不应该将数据库中的所有2个lac记录都提取到应用程序中。你应该只取需要的东西

正如您所说的,有4个表连接在主表上,您必须为它们提供Hibernate实体类以及它们之间的对应映射。使用分页技术仅获取显示给用户的行数。Hibernate知道如何在特定数据库上高效地执行此操作


您甚至可以在HQL中使用聚合函数:
count()、min()、max()、sum()和avg()
来获取相关数据。

您想一次获取并排序2条lac记录,还是需要进行分页?如果您需要在批处理之后的任何其他操作中加载如此数量的数据,则会出现设计问题,不是编程问题。@Debojit Saikia,是的,我在客户端和服务器端都有分页。但是我需要在Java/服务层和应用排序上执行一些计算,然后我必须将结果列表(这里是0到20个结果)发送到UI。您如何从DB中获取数据?使用Hibernate?@Debojit Saikia,是的,使用HibernateTemplate。