解決,當然在發佈後它打我...現在使用不同的驅動程序從http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC#Download不需要廣泛的配置。JDBC SELECT與Firefox DB管理器相比非常緩慢
原始問題在休息之下。
我用含OpenStreetMap的數據SQLite數據庫打打鬧鬧,和我遇到一些麻煩JDBC。
下面的查詢是我想用來獲取位置接近我的用戶quicky位置(數字是從我的測試數據,並由Java代碼添加)。
SELECT roads.nodeID, lat, lon
FROM roads
INNER JOIN nodes
ON roads.nodeID=nodes.nodeID
ORDER BY (ABS(lat - (12.598418)) + ABS(lon - (-70.043514))) ASC
LIMIT 1
「道路」和「節點」都包含大約130,000行。
這個特定的查詢是最密集的buyt之一,它只用了兩次,所以應該可以滿足我的需求。它在使用Firefox SQLite時大約在281毫秒內執行,但在使用sqlitejdbc-v056的Java中,需要12到14秒(完全處理器負載)。
有關如何解決此問題的任何線索?
public Node getNodeClosestToLocation(Location loc){
try {
Class.forName("org.sqlite.JDBC");
Statement stat = conn.createStatement();
String q = "SELECT roads.nodeID, lat, lon "+
"FROM roads "+
"INNER JOIN nodes "+
"ON roads.nodeID=nodes.nodeID "+
"ORDER BY (ABS(lat - ("+loc.getLat()+")) +
ABS(lon - ("+loc.getLon()+"))) ASC "+
"LIMIT 1";
long start = System.currentTimeMillis();
System.out.println(q);
rs = stat.executeQuery(q);
if(rs.next()) {
System.out.println("Done. " + (System.currentTimeMillis() - start));
return new Node(rs.getInt("nodeID"), rs.getFloat("lat"), rs.getFloat("lon"));
}
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
sqllite查詢如何與瀏覽器相關?那應用程序中可能還有其他組件嗎? – kosa 2012-04-02 16:15:56
對不起,這只是爲了證明查詢本身不應該慢,因爲另一個應用(在這種情況下,用於Firefox瀏覽器的SQLite DB管理器插件)的速度要快得多。你可以看到我在做計時,這是一個非常'年輕'的項目,只有一個單線程運行。 – 2012-04-02 16:21:09
你確定你使用相同數量的數據,相同的查詢和結果是一樣的嗎?並且都是從同一個內存存儲器讀取的 - RAM/HDD/SDD?如果您從RAM中讀取100行進行FF測試,而從HDD讀取100行數據,則不會有任何疑問:)否則,這可能是Java實施中的一個錯誤 – Aprillion 2012-04-02 16:38:31