我試圖從Java中的SQL數據庫讀出一列,我想結果返回到一個數組中。這裏是功能:Java:如何有效地從數據庫中讀取?
public static double[] open(Connection conn,String symbol,int startdate,int enddate) throws SQLException {
int id = database.get_stockid(conn, symbol);
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select price_open from stock_data where stock_id="+id+" and date>="+startdate+" and date<="+enddate+";");
ArrayList<Double> data = new ArrayList<Double>();
while(rs.next()) {
data.add(rs.getDouble("open"));
}
double[] data1 = new double[data.size()];
for(int a = 0; a < data1.length; ++a) {
data1[a]=data.get(a);
}
return data1;
}
這很慢。它需要1.5秒與我的sqlite數據庫。這是讀出一列的標準方式,還是我做錯了什麼?這是我應用程序中的瓶頸,所以我需要它儘可能快。
編輯: 謝謝。我剛發現ArrayList沒有引起問題。瓶頸必須在sql部分: 如果我只加載數據10天,只要加載數據10年就需要多長時間。所以我必須改進我的sql,但是如何?
這裏改進代碼:
public static double[] open(Connection conn,String symbol,int startdate,int enddate) throws SQLException {
int id = database.get_stockid(conn, symbol);
PreparedStatement stat = conn.prepareStatement("select price_open from stock_data where (stock_id="+id +") and (date between "+startdate+" and "+enddate+");");
ResultSet rs = stat.executeQuery();
ArrayList<Double> data = new ArrayList<Double>();
while(rs.next()) {
data.add(rs.getDouble(1));
}
double[] data1 = new double[data.size()];
for(int a = 0; a < data1.length; ++a) {
data1[a]=data.get(a);
}
return data1;
}
您的查詢選擇'price_open',但您的ResultSet調用'getDouble(「open」)''。這實際上是否按預期工作?另外,您一次獲取多少行數據? – Vulcan
首先,讓你的查詢運行得很快。 – ntalbs
您的數據庫是否已正確編入索引? – Supericy