Решено , конечно после публикации здесь меня поразило ... Теперь используются разные драйверы из http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC#Download, которые не нуждаются в расширенной настройке.
Оригинальный вопрос ниже перерыва.
Я дурачусь с базой данных SQLite, содержащей данные OpenStreetMap, и у меня возникли некоторые проблемы с JDBC.
Запрос ниже - это тот, который я хотел бы использовать, чтобы быстро найти местоположение, близкое к местоположению моего пользователя (числа взяты из моих тестовых данных и добавлены кодом 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 строк.
Этот конкретный запрос - один из самых интенсивных, он используется только дважды, так что он будет в порядке для моих нужд. При использовании Firefox SQLite он выполняется примерно за 281 мс, но в Java с использованием sqlitejdbc-v056 это занимает от 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;
}