2013-02-25 98 views
0

我正在使用sqlalchemy創建與postgresql的連接並執行簡單命令。當網絡連接斷開或硬啓動服務器時,與postgres的套接字連接不暢通

>>> from sqlalchemy import create_engine 
>>> c = create_engine('postgres://[email protected]/mydb?keepalives_idle=4&keepalives_interval=1&keepalives_count=5') 
>>> c.execute('select 1').scalar() 
1 

其工作正常。

在執行查詢時創建連接後,它將在此示例中創建套接字到postgres服務器,它將創建套接字到myremoteserver。我們可以用unix ss命令檢查插座。 (您也可以使用netstat)。

[[email protected] ~]# ss -torp | grep python 
ESTAB  0  0   192.168.1.15:43471  myremoteserver:postgres timer:(keepalive,1.319ms,0) users:(("python",4074,3)) 

如果在創建連接後網絡發生故障或postgres服務器崩潰。

>>> c = create_engine('postgres://[email protected]/mydb?keepalives_idle=4&keepalives_interval=1&keepalives_count=5') 

(您可以爲網絡上的myremoteserverifdown eth0下)

然後,它會關閉後5次嘗試與服務器的連接。

[[email protected] ~]# ss -torp | grep python 
ESTAB  0  0   192.168.1.15:43471  myremoteserver:postgres timer:(keepalive,1.319ms,0) users:(("python",4074,3)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  0   192.168.1.15:43471  myremoteserver:postgres timer:(keepalive,738ms,0) users:(("python",4074,3)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  0   192.168.1.15:43471  myremoteserver:postgres timer:(keepalive,2.720ms,0) users:(("python",4074,3)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  0   192.168.1.15:43471  myremoteserver:postgres timer:(keepalive,788ms,2) users:(("python",4074,3)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  0   192.168.1.15:43471  myremoteserver:postgres timer:(keepalive,191ms,4) users:(("python",4074,3)) 
[[email protected] ~]# ss -torp | grep python 
[[email protected] ~]# ss -torp | grep python 

這是我們在連接字符串中設置的連接的行爲。

如果我們在套接字關閉和服務器關閉之前執行查詢,則會發生問題。

# do ifdown eth0 on postgres server to break the network connection. 
# execute query before socket close. 
>>> c.execute('select 1').scalar() 

現在,如果您檢查插座然後

[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,1.602ms,3) users:(("python",3098,7)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,585ms,3) users:(("python",3098,7)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,2.833ms,4) users:(("python",3098,7)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,1.851ms,4) users:(("python",3098,7)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,808ms,4) users:(("python",3098,7)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,5.393ms,5) users:(("python",3098,7)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,3.846ms,5) users:(("python",3098,7)) 
................. 
................. 
................. 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,5.268ms,72) users:(("python",3098,7)) 
[[email protected] ~]# ss -torp | grep python 
ESTAB  0  74   192.168.1.15:43471  myremoteserver:postgres timer:(on,4.804ms,254) users:(("python",3098,7)) 

按連接字符串插座必須經過5次嘗試接近。但我不知道它的嘗試超過5次,達到254次。

即使我們在客戶端執行服務器崩潰和套接字關閉之間執行查詢,也必須在5次嘗試後關閉套接字。

注意:keepalives_idle,keepalives_interval和keepalives_count用於設置TCP連接中的keepalive參數。

回答

1

從PostgreSQL文檔:

控制被認爲是死在客戶端與服務器的連接之前可以丟失TCP持久連接的數量。零值使用系統默認值。對於通過Unix域套接字進行的連接,或者保持活動被禁用,此參數將被忽略。它僅在TCP_KEEPCNT套接字選項可用的系統上受支持;在其他系統上,它不起作用。

換句話說。如果您的系統不支持它,它不起作用,並且正常的超時規則將適用。

相關問題