2012-07-18 67 views
1

我使用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和在訪問這點。

有沒有人有任何想法爲什麼它第一次更慢(或更多爲什麼它在後續運行速度更快)? 另外,有沒有什麼一般的東西我可以做得更好,使其更快?

謝謝你的時間。

+0

幾乎所有的數據庫第一次都會變慢。 – Keppil 2012-07-18 12:29:15

+0

這是爲什麼呢?如果我正確地關閉了與數據庫的連接,它必須從頭開始重新開始。數據仍然以某種方式保存在RAM中? – Russell 2012-07-18 12:31:49

+0

除了構建緩存之外,還有很多其他內容都在引擎蓋下,比如評估計劃和其他活動,以便後續運行更快。 – Keppil 2012-07-18 13:04:38

回答

0

你說兩百萬行,但數據有多大?它很有可能是第一次從磁盤讀取它,然後在磁盤高速緩存中進行後續運行。即使整個數據集不能立即放入RAM中,關鍵數據結構仍可能存在。

+0

有趣。 Access數據庫的大小約爲1GB。儘管如此,我並沒有全部閱讀。我不確定如何估計我實際採用的數據的大小。也許10%。 – Russell 2012-07-18 12:43:36

相關問題