@@ -91,11 +91,11 @@ def _get_conn(self):
9191 conn .set_isolation_level (psycopg2 .extensions .ISOLATION_LEVEL_READ_COMMITTED )
9292 return conn
9393
94- def _put_conn (self , conn ):
94+ def _put_conn (self , conn , close = False ):
9595 if conn is not None :
9696 if self .trace :
97- logger .debug (f"Returning connection to pool dsn={ conn .dsn } status={ conn .status } " )
98- self .pool .putconn (conn )
97+ logger .debug (f"Returning connection to pool dsn={ conn .dsn } status={ conn .status } close= { close } " )
98+ self .pool .putconn (conn , close = close )
9999
100100 def close (self ):
101101 """
@@ -111,13 +111,24 @@ def close(self):
111111 def _pooled_execute_stmt (self , sql , params , resultfunc = lambda cur : None ):
112112 """Execute and commit one statement on a pooled connection, returning result of resultfunc applied to cursor.
113113 """
114- conn = self ._get_conn ()
115- with conn .cursor () as cur :
116- cur .execute (sql , params )
117- result = resultfunc (cur )
118- conn .commit ()
119- self ._put_conn (conn )
120- return result
114+ conn = None
115+ error = 'unknown error'
116+ try :
117+ conn = self ._get_conn ()
118+ with conn .cursor () as cur :
119+ cur .execute (sql , params )
120+ result = resultfunc (cur )
121+ conn .commit ()
122+ self ._put_conn (conn )
123+ conn = None
124+ return result
125+ except Exception as e :
126+ error = e
127+ raise
128+ finally :
129+ if conn is not None :
130+ logger .warning (f"Closing pooled connection due to error={ error } " )
131+ self ._put_conn (conn , close = True )
121132
122133 def setex (self , key : str , value : Union [str , bytes ], ttl : int ) -> None :
123134 expires_at = time .time () + ttl
0 commit comments