Java 在hibernate中从表中大容量获取

Java 在hibernate中从表中大容量获取,java,performance,hibernate,bulk-load,Java,Performance,Hibernate,Bulk Load,我有一个表,从中我获取了大约250000条记录,这大约需要25分钟,有没有办法缩短获取时间。我使用的代码如下:- query.setParameterList("studentId", StudentIdList); 有什么方法可以优化它吗?如果从SQL命令行开始不到10分钟,从Hibernate开始超过25分钟,那么您可能需要查看上的信息。特别是,您可能会受益于无状态会话(尤其是在您没有做太多工作的情况下)。如果您真的没有做太多的工作,您可以使用DML语句(也在该URL中)。如果从SQL命令

我有一个表,从中我获取了大约250000条记录,这大约需要25分钟,有没有办法缩短获取时间。我使用的代码如下:-

query.setParameterList("studentId", StudentIdList);

有什么方法可以优化它吗?

如果从SQL命令行开始不到10分钟,从Hibernate开始超过25分钟,那么您可能需要查看上的信息。特别是,您可能会受益于无状态会话(尤其是在您没有做太多工作的情况下)。如果您真的没有做太多的工作,您可以使用DML语句(也在该URL中)。

如果从SQL命令行到Hibernate的时间不到10分钟,从Hibernate到它的时间超过25分钟,那么您可能需要查看有关的信息。特别是,您可能会受益于无状态会话(尤其是在您没有做太多工作的情况下)。如果你真的没有做太多的工作,你可以使用DML语句(也在那个URL中)

有没有办法优化它

如果你想让它更快,你可以从一个文件进行批量导出和加载。或者干脆不使用数据库;)

使用其他存储数据的方法可以加快速度。使用数据库可能会获得这样的性能,但有时最简单的方法是最好的

public static void main(String... args) throws IOException {
    File file = new File("students.csv");

    PrintWriter pw = new PrintWriter(file);
    for (int i = 0; i < 250 * 1000; i++)
        pw.println("student " + i + ", last " + i + ", email.address" + i + "@my-school.com," + i);
    pw.close();

    long start = System.nanoTime();
    BufferedReader br = new BufferedReader(new FileReader(file));
    List<Student> students = new ArrayList<Student>();
    for (String line; ((line = br.readLine()) != null);) {
        int pos = line.indexOf(',');
        int pos2 = line.indexOf(',', pos + 1);
        int pos3 = line.indexOf(',', pos2 + 1);
        students.add(new Student(line.substring(0, pos), line.substring(pos + 1, pos2), line.substring(pos2 + 1, pos3), Integer.parseInt(line.substring(pos3 + 1))));
    }
    br.close();
    long time = System.nanoTime() - start;
    System.out.printf("Time to load %,d students was %.1f ms.%n", students.size(), time / 1e6);
}
有没有办法优化它

如果你想让它更快,你可以从一个文件进行批量导出和加载。或者干脆不使用数据库;)

使用其他存储数据的方法可以加快速度。使用数据库可能会获得这样的性能,但有时最简单的方法是最好的

public static void main(String... args) throws IOException {
    File file = new File("students.csv");

    PrintWriter pw = new PrintWriter(file);
    for (int i = 0; i < 250 * 1000; i++)
        pw.println("student " + i + ", last " + i + ", email.address" + i + "@my-school.com," + i);
    pw.close();

    long start = System.nanoTime();
    BufferedReader br = new BufferedReader(new FileReader(file));
    List<Student> students = new ArrayList<Student>();
    for (String line; ((line = br.readLine()) != null);) {
        int pos = line.indexOf(',');
        int pos2 = line.indexOf(',', pos + 1);
        int pos3 = line.indexOf(',', pos2 + 1);
        students.add(new Student(line.substring(0, pos), line.substring(pos + 1, pos2), line.substring(pos2 + 1, pos3), Integer.parseInt(line.substring(pos3 + 1))));
    }
    br.close();
    long time = System.nanoTime() - start;
    System.out.printf("Time to load %,d students was %.1f ms.%n", students.size(), time / 1e6);
}

您的数据库中有此列的索引吗?如果从SQL命令行执行相同的搜索,需要多长时间?我认为需要在上面创建索引studentId@peter,我在学生id上有一个索引,当我从SQL命令行获取它时不到10分钟。@Suraj:请看我上面的评论。。不知道多少,但这是内部准备好的语句吗?在这种情况下,您可能需要启用dynamic_prepareDo,您的数据库中的这列是否有索引?如果从SQL命令行执行相同的搜索,需要多长时间?我认为需要在上面创建索引studentId@peter,我在学生id上有一个索引,当我从SQL命令行获取它时不到10分钟。@Suraj:请看我上面的评论。。不知道多少,但这是内部准备好的语句吗?在这种情况下,您可能需要启用动态_prepare@Mogsdad作为的用户,您知道不能将长的格式化代码放入注释中。如果您有一个深思熟虑的建议,我会感兴趣的。@Mogsdad这是一个答案,尽管我怀疑OP可能在大约四年前就失去了兴趣。@Mogsdad是的用户,因此您知道您不能在注释中放置长的格式化代码。如果你有一个深思熟虑的建议,我会感兴趣的。@Mogsdad这是一个答案,尽管我怀疑OP可能在大约四年前就失去了兴趣。