Java で SQL データベースから列を読み込もうとしています。結果を配列で返したいと思います。関数は次のとおりです。
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;
}
これはかなり遅いです。私のsqliteデータベースでは1.5秒かかります。これは列を読み上げる標準的な方法ですか、それとも何か間違っていますか? これが私のアプリケーションのボトルネックであるため、できるだけ高速にする必要があります。
編集:ありがとう。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;
}