2013-11-26 44 views
3

我正在使用psycopg2從python訪問postgresql數據庫。當我嘗試運行的最短路徑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 

door ='S''表示門已關閉,在這種情況下,值爲-1。

回答

3

我假設你可以在python中檢查你的連接狀態(我不使用python),所以你可以恢復並做一些合理的事情,比如重新連接。您可能需要休息幾秒鐘才能讓數據庫在重新連接之前從崩潰中恢復。

關於pgrouting問題,我希望看到一個簡單的測試用例,可以在pgadmin或psql shell中重現此問題,並將其作爲錯誤提交,以便我可以查看它。我們的代碼不應該使服務器崩潰,但有時它確實會發生,我們需要解決這些問題。

+0

我在我的問題中添加了SQL查詢。也許它可以幫助你。 – Antonin

+0

我問了一個單獨的問題:[pgr_astar和不可能的邊緣(例如,鎖着的門)](http://stackoverflow.com/questions/20271054/pgr-astar-and-impossible-edges-eg-lockeddoors ) – Antonin

相關問題