mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #15802 -- pyscopg2 sometimes fail to close the connection when it's already closed by the server, Thanks Rick van Hattem
git-svn-id: http://code.djangoproject.com/svn/django/trunk@16708 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -14,6 +14,7 @@ from django.db.backends.postgresql_psycopg2.creation import DatabaseCreation | |||||||
| from django.db.backends.postgresql_psycopg2.version import get_version | from django.db.backends.postgresql_psycopg2.version import get_version | ||||||
| from django.db.backends.postgresql_psycopg2.introspection import DatabaseIntrospection | from django.db.backends.postgresql_psycopg2.introspection import DatabaseIntrospection | ||||||
| from django.utils.safestring import SafeUnicode, SafeString | from django.utils.safestring import SafeUnicode, SafeString | ||||||
|  | from django.utils.log import getLogger | ||||||
|  |  | ||||||
| try: | try: | ||||||
|     import psycopg2 as Database |     import psycopg2 as Database | ||||||
| @@ -29,6 +30,8 @@ psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) | |||||||
| psycopg2.extensions.register_adapter(SafeString, psycopg2.extensions.QuotedString) | psycopg2.extensions.register_adapter(SafeString, psycopg2.extensions.QuotedString) | ||||||
| psycopg2.extensions.register_adapter(SafeUnicode, psycopg2.extensions.QuotedString) | psycopg2.extensions.register_adapter(SafeUnicode, psycopg2.extensions.QuotedString) | ||||||
|  |  | ||||||
|  | logger = getLogger('django.db.backends') | ||||||
|  |  | ||||||
| class CursorWrapper(object): | class CursorWrapper(object): | ||||||
|     """ |     """ | ||||||
|     A thin wrapper around psycopg2's normal cursor class so that we can catch |     A thin wrapper around psycopg2's normal cursor class so that we can catch | ||||||
| @@ -114,6 +117,24 @@ class DatabaseWrapper(BaseDatabaseWrapper): | |||||||
|         self.cursor().execute('SET CONSTRAINTS ALL IMMEDIATE') |         self.cursor().execute('SET CONSTRAINTS ALL IMMEDIATE') | ||||||
|         self.cursor().execute('SET CONSTRAINTS ALL DEFERRED') |         self.cursor().execute('SET CONSTRAINTS ALL DEFERRED') | ||||||
|  |  | ||||||
|  |     def close(self): | ||||||
|  |         if self.connection is None: | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             self.connection.close() | ||||||
|  |             self.connection = None | ||||||
|  |         except psycopg2.Error: | ||||||
|  |             # In some cases (database restart, network connection lost etc...) | ||||||
|  |             # the connection to the database is lost without giving Django a | ||||||
|  |             # notification. If we don't set self.connection to None, the error | ||||||
|  |             # will occur a every request. | ||||||
|  |             self.connection = None | ||||||
|  |             logger.warning('psycopg2 error while closing the connection.', | ||||||
|  |                 exc_info=sys.exc_info() | ||||||
|  |             ) | ||||||
|  |             raise | ||||||
|  |  | ||||||
|     def _get_pg_version(self): |     def _get_pg_version(self): | ||||||
|         if self._pg_version is None: |         if self._pg_version is None: | ||||||
|             self._pg_version = get_version(self.connection) |             self._pg_version = get_version(self.connection) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user