Я работаю над кратчайшим путем * алгоритмом в java с mysql db. Я выполняю следующий SQL Query примерно 300 раз в программе, чтобы найти маршруты соединений из базы данных из 10 000 соединений шины. Выполнение запроса занимает около 6-7 секунд. Любые предложения о том, как я могу ускорить это или какие-либо идеи по другому методу, который я могу использовать? БлагодаряУскорить несколько запросов SQL JDBC?
private HashMap<Coordinate,Node> closedNodes;
private PriorityQueue<Node> openNodes;
..
private List<Coordinate> calculatePath()
{
//While there are nodes in the open list
while (!openNodes.isEmpty())
{
//Get the node with the lowest gVal+hVal
Node node = openNodes.poll();
//Add it to the closed list
closedNodes.put(node);
//If it is not the goal node
if (!node.equals(goal))
{
//Get all the neighbours and Create neighbour node
List<Node> neighbours = helper.getNeighbours(node, goal);
//For each neighbour
for (Node neighbourNode : neighbours)
{
//Check if the neighbour is in the list of open nodes
boolean isInOpen = checkOpenNodes(neighbourNode);
//If it is not in the open nodes and not in the closed nodes
if ((!closedNodes.containsKey(neighbourNode))&& (!isInOpen))
{
//Add it to the list of open nodes
openNodes.add(neighbourNode);
}
}
}
else
{
// We found the path
path = backTrackPath(node);
break;
}
}
return path;
/**
* Gets the list of valid Nodes that are possible to travel to from <b>Node</b>
* @param stopNode Node to find neighbours for
* @param goal End Node
* @return list of neighbour Nodes
*/
public ArrayList<Node> getNeighbours(Node stopNode, Node goal)
{
ArrayList<Node> neighbours = new ArrayList<Node>();
Node neighbourNode;
//get neighbours connected to stop
try {
ResultSet rs = stmt.executeQuery("select To_Station_id, To_Station_routeID, To_Station_stopID," +
"To_Station_lat, To_Station_lng, Time from connections where Connections.From_Station_stopID ="
+stopNode.getCoord().getStopID()+" ORDER BY Connections.Time");
rs = stmt.getResultSet();
while (rs.next()) {
int id = rs.getInt("To_Station_id");
String routeID = rs.getString("To_Station_routeID");
String stopID = rs.getString("To_Station_stopID");
String stopName = rs.getString("To_Station_stopName");
Double lat = rs.getDouble("To_Station_lat");
Double lng = rs.getDouble("To_Station_lng");
int time = rs.getInt("Time");
neighbourNode = new Node(id, routeID, stopID, stopName, lat, lng);
neighbourNode.prev = stopNode;
neighbourNode.gVal = stopNode.gVal + time;
neighbourNode.hVal = heuristic.calculateHeuristic(neighbourNode, goal);
neighbours.add(neighbourNode);
}
}
catch (SQLException e) {
e.printStackTrace();
}
return neighbours;
}
Спасибо за все ваши ответы. Да, у меня есть граф с Stations как узлы. Я обновил вопрос с полным кодом методов, которые я использую. Метод getNeighbours() передается узлу с наименьшим значением ((стоимость достижения узла) + (расстояние до узла цели)) с помощью PriorityQueue. Вот почему я должен запрашивать базу данных каждый раз, когда это новый узел поверх очереди приоритетов. Я не могу предсказать, какой узел будет рядом с первым в очереди приоритетов, пока я не получу доступ к ним соседей узлов. Я не могу кэшировать данные о прекращении подключения, поскольку он содержит 10 000+ соединений. Все предложения? – patrickandroid
Не используйте БД. Загрузите все данные в объект «graph» в основной памяти. В моем проекте у меня есть миллионы узлов (и еще больше ребер) на графике и какой-то алгоритм Дейкстры, который работает на всем этом, и я получаю время работы намного меньше секунды. – jutky
Этот код JDBC пропускает ресурсы. Исправьте его как можно скорее. – BalusC