2013-11-26 2 views
3

Я использую psycopg2 для доступа к базе данных postgresql из python. Когда я пытаюсь запустить функцию pgrouting «pgr_astar» для кратчайшего пути, я получаю сообщение об ошибкеpsycopg2.InterfaceError: соединение уже закрыто/pgr_astar

cur = db.cursor() 
psycopg2.InterfaceError: connection already closed 

В основном то, что произошло: когда pgr_astar не находит путь между двумя точками, он создает крах базы данных и закрывает соединение с базой данных.

Как можно избежать этого?

Я попытался выделить функцию с Try/за исключением и создать свою собственную связь, поэтому никаких проблем, если она не закрывает:

conn = psycopg2.connect(...) 
try: 
    result = getRecords(conn,query_pgr_astar) 
    return float(result[0]['sum']) 
except: 
    return 500000000.0 
conn.close() 

Но в этом случае я получаю

cur.execute(query) 
psycopg2.DatabaseError: SSL SYSCALL error: EOF detected 

Как можно управлять невозможными путями?

(я сделал то же самое с pgdb и старой функции shortest_path_astar (не доступен для меня больше), и у меня не было никаких проблем)

Postgresql журнала является:

2013-11-27 15:54:35 CET LOG: terminating any other active server processes 
2013-11-27 15:54:35 CET WARNING: terminating connection because of crash of another server process 
2013-11-27 15:54:35 CET DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 
2013-11-27 15:54:35 CET HINT: In a moment you should be able to reconnect to the database and repeat your command. 
2013-11-27 15:54:35 CET WARNING: terminating connection because of crash of another server process 
2013-11-27 15:54:35 CET DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 
2013-11-27 15:54:35 CET HINT: In a moment you should be able to reconnect to the database and repeat your command. 
2013-11-27 15:54:35 CET LOG: all server processes terminated; reinitializing 
2013-11-27 15:54:35 CET LOG: database system was interrupted; last known up at 2013-11-27 15:42:01 CET 
2013-11-27 15:54:35 CET LOG: database system was not properly shut down; automatic recovery in progress 
2013-11-27 15:54:35 CET LOG: record with zero length at 65/80875D60 
2013-11-27 15:54:35 CET LOG: redo is not required 
2013-11-27 15:54:35 CET LOG: autovacuum launcher started 
2013-11-27 15:54:35 CET LOG: database system is ready to accept connections 

Запрос я делаю :

SELECT SUM(t2.length) FROM (SELECT id2 FROM pgr_astar('SELECT edge_id AS id, vertex_id1 AS source, vertex_id2 AS target, ' || '(CASE WHEN door = ''S'' THEN -1.0 ELSE (length * (CASE network WHEN ''0'' THEN 1.0 WHEN ''10'' THEN 1.2 WHEN ''20'' THEN 1.5 WHEN ''30'' THEN 2.0 ELSE 1.0 END) * (CASE type WHEN ''9.1'' THEN CASE WHEN level1 < level2 THEN 3.0 ELSE 2.0 END WHEN ''9.2'' THEN CASE WHEN level1 < level2 THEN 15.0 ELSE 12.0 END ELSE 1.0 END) + (CASE type WHEN ''9.3'' THEN 40.0 ELSE 0.0 END) ) END)::float8 AS cost, ' || '(CASE WHEN door_rev = ''S'' THEN -1.0 ELSE (length * (CASE network WHEN ''0'' THEN 1.0 WHEN ''10'' THEN 1.2 WHEN ''20'' THEN 1.5 WHEN ''30'' THEN 2.0 ELSE 1.0 END) * (CASE type WHEN ''9.1'' THEN CASE WHEN level1 < level2 THEN 3.0 ELSE 2.0 END WHEN ''9.2'' THEN CASE WHEN level1 < level2 THEN 15.0 ELSE 12.0 END ELSE 1.0 END) + (CASE type WHEN ''9.3'' THEN 40.0 ELSE 0.0 END) ) END)::float8 AS reverse_cost, ' || 'x1, y1, x2, y2 FROM edges', " + str(destination_route) + ", " + str(origin_route) + ", TRUE, TRUE)) as t1, edges as t2 where t1.id2 = t2.edge_id 

дверь = '' S '' означает дверь закрыта, и в этом случае, значение равно -1.

ответ

3

Я предполагаю, что вы можете проверить свой статус соединения в python (я не использую python), чтобы вы могли восстановить и сделать что-то разумное, например, повторно подключиться. Возможно, вам понадобится спать на пару секунд, чтобы база данных восстановилась после сбоя, прежде чем снова подключиться.

Что касается вопроса pgrouting, я хотел бы увидеть простой тестовый пример, который может воспроизвести эту проблему в оболочке pgadmin или psql, поданной как ошибка, чтобы я мог ее изучить. Наш код никогда не должен разбивать сервер, но иногда это происходит, и нам нужно исправить эти проблемы.

+0

Я добавил SQL-запрос в свой вопрос. Может быть, это поможет вам. – Antonin

+0

Я задал вопрос в отдельном вопросе: [pgr_astar и невозможные края (например, заблокированные двери)] (http://stackoverflow.com/questions/20271054/pgr-astar-and-impossible-edges-eg-locked-doors) – Antonin

 Смежные вопросы

  • Нет связанных вопросов^_^