我使用jdbc:odbc橋接連接到Access數據庫。 然後我從數據庫中選擇大量的數據(〜200萬行)。 重啓後第一次運行代碼非常慢,需要6分鐘才能檢索數據。 在後續運行中,只需1.5分鐘即可完成同樣的任務。從Java調用MS Access的SQL命令首次非常慢,後續運行速度要快得多
這是我使用連接到數據庫的代碼:
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + databaseLocation + databaseName + ";selectMethod=cursor; READONLY=true; TYPE=FASTLOAD";
con = DriverManager.getConnection(url);
System.out.println("Connected to " + databaseName);
} catch (SQLException e) {
System.out.println("SQL Exception: " + e.toString());
} catch (ClassNotFoundException cE) {
System.out.println("Class Not Found Exception: " + cE.toString());
}
多少谷歌搜索我已經嘗試添加參數,如
selectMethod=cursor
READONLY=true
TYPE=FASTLOAD
後,據我所看到的,這些都沒有改變。
我再選擇的數據,像這樣:
String SQL = "SELECT ADDRESS_MODEL.ADDR_LINE_1, ADDRESS_MODEL.ADDR_LINE_2, LOCALITIES.NAME, ADDRESS_MODEL.SECONDARY_LOCALITY, TLANDS.NAME, ADDRESS_MODEL.POST_TOWN, ADDRESS_MODEL.COUNTY FROM ((ADDRESS_MODEL LEFT JOIN BUILDINGS ON ADDRESS_MODEL.BUILDING_ID = BUILDINGS.BUILDING_ID) LEFT JOIN LOCALITIES ON BUILDINGS.LOCALITY_ID = LOCALITIES.LOCALITY_ID) LEFT JOIN TLANDS ON BUILDINGS.TLAND_ID = TLANDS.TLAND_ID WHERE BUILDINGS.COUNTY_ID = " + county_ID;
PreparedStatement prest = con.prepareStatement(SQL);
ResultSet result = prest.executeQuery();
我試圖用事先準備好的聲明,但我不知道我所做的是正確的。
存儲數據後,我關閉ResultSet:
result.close();
在節目之後,我關閉連接如下:
try{
stmt.close();
con.close();
System.out.println("Connection to " + databaseName + " closed");
} catch (SQLException e) {
System.out.println("SQL Exception: " + e.toString());
}
不幸的是我將致力於使用Java和在訪問這點。
有沒有人有任何想法爲什麼它第一次更慢(或更多爲什麼它在後續運行速度更快)? 另外,有沒有什麼一般的東西我可以做得更好,使其更快?
謝謝你的時間。
幾乎所有的數據庫第一次都會變慢。 – Keppil 2012-07-18 12:29:15
這是爲什麼呢?如果我正確地關閉了與數據庫的連接,它必須從頭開始重新開始。數據仍然以某種方式保存在RAM中? – Russell 2012-07-18 12:31:49
除了構建緩存之外,還有很多其他內容都在引擎蓋下,比如評估計劃和其他活動,以便後續運行更快。 – Keppil 2012-07-18 13:04:38