2011-06-10 44 views
0

我有一張表,從那裏我可以在大約250,000條記錄的某處找到記錄,這需要大約25分鐘,是否有一種方法可以減少獲取時間。我使用下面的一些代碼: -從一張表在休眠狀態下批量提取

query.setParameterList("studentId", StudentIdList); 

有沒有一種方法來優化它?

+0

你在你的數據庫有此列索引?如果您從SQL命令行執行相同的搜索,需要多長時間? – 2011-06-10 11:18:57

+0

我想你需要在studentId – 2011-06-10 11:20:14

+0

@peter上創建一個索引,我有一個關於學生id的索引,當我從SQL命令行獲取時,它需要不到10分鐘。 – 2011-06-10 11:21:35

回答

4

如果從SQL命令行花費不到10分鐘,而從Hibernate花費超過25分鐘,那麼您可能需要查看batching上的信息。特別是你可能會從無狀態會話中受益(特別是如果你沒有做太多工作)。如果你真的沒有做很多工作,你可能會使用DML語句(也在該URL中)。

-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. 
+0

@Mogsdad作爲SO的用戶,你知道你不能將長的格式化代碼放入評論中。如果你有一個深思熟慮的建議,我會感興趣。 – 2015-09-17 15:24:43

+1

@Mogsdad它被定位爲答案,儘管我懷疑OP可能在四年前失去了興趣。 – 2015-09-17 15:40:12

相關問題