从休眠中的表中批量获取

时间:2011-06-10 11:12:35

标签: java performance hibernate bulk-load

我有一张桌子,从那里我拿起大约250,000条记录的记录,这需要大约25分钟,有没有办法减少获取时间。我使用的代码如下: -

query.setParameterList("studentId", StudentIdList);

有没有办法优化它?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:-2)

  

有没有办法优化它?

如果您想加快速度,可以批量导出并从文件加载。或者只是不使用数据库;)

使用其他方法存储数据可以更快。您可以通过数据库获得这样的性能,但有时最简单的方法是最好的。

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

我使用了来自http://introcs.cs.princeton.edu/java/32class/Student.java.html

的学生

打印

Time to load 250,000 students was 228.7 ms.