@@ -564,10 +564,19 @@ def _reset_cursor(self) -> None:
564564 """
565565 Reset the DDBC statement handle.
566566 """
567+ # Clear cache references before resetting
568+ self ._cached_column_map = None
569+ self ._cached_converter_map = None
570+
567571 if self .hstmt :
568- self .hstmt .free ()
569- self .hstmt = None
570- log ("debug" , "SQLFreeHandle succeeded" )
572+ try :
573+ self .hstmt .free ()
574+ self .hstmt = None
575+ log ("debug" , "SQLFreeHandle succeeded" )
576+ except Exception as e : # pylint: disable=broad-exception-caught
577+ # Handle case where connection might already be closed
578+ log ("warning" , "Error freeing statement handle during reset: %s" , e )
579+ self .hstmt = None
571580
572581 self ._clear_rownumber ()
573582
@@ -590,6 +599,10 @@ def close(self) -> None:
590599 # Clear messages per DBAPI
591600 self .messages = []
592601
602+ # Clear cache references before cleanup to prevent issues during connection close
603+ self ._cached_column_map = None
604+ self ._cached_converter_map = None
605+
593606 # Remove this cursor from the connection's tracking
594607 if (
595608 hasattr (self , "connection" )
@@ -602,9 +615,15 @@ def close(self) -> None:
602615 log ("warning" , "Error removing cursor from connection tracking: %s" , e )
603616
604617 if self .hstmt :
605- self .hstmt .free ()
606- self .hstmt = None
607- log ("debug" , "SQLFreeHandle succeeded" )
618+ try :
619+ self .hstmt .free ()
620+ self .hstmt = None
621+ log ("debug" , "SQLFreeHandle succeeded" )
622+ except Exception as e : # pylint: disable=broad-exception-caught
623+ # On Linux, freeing statement handles after connection is closed can hang
624+ # Log the error but don't propagate to avoid hangs
625+ log ("warning" , "Error freeing statement handle (connection may be closed): %s" , e )
626+ self .hstmt = None
608627 self ._clear_rownumber ()
609628 self .closed = True
610629
0 commit comments