我正在使用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')
(您可以爲網絡上的myremoteserver
做ifdown 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參數。