Author: aaugustin
Date: 2011-12-11 00:19:04 -0800 (Sun, 11 Dec 2011)
New Revision: 17194

Modified:
   django/trunk/django/db/backends/postgresql_psycopg2/base.py
   django/trunk/docs/ref/databases.txt
Log:
Fixed #17266 -- Skipped the "SET TIME ZONE" query for PostgreSQL when it isn't 
necessary.


Modified: django/trunk/django/db/backends/postgresql_psycopg2/base.py
===================================================================
--- django/trunk/django/db/backends/postgresql_psycopg2/base.py 2011-12-11 
01:00:41 UTC (rev 17193)
+++ django/trunk/django/db/backends/postgresql_psycopg2/base.py 2011-12-11 
08:19:04 UTC (rev 17194)
@@ -174,12 +174,21 @@
                 conn_params['port'] = settings_dict['PORT']
             self.connection = Database.connect(**conn_params)
             self.connection.set_client_encoding('UTF8')
-            # Set the time zone in autocommit mode (see #17062)
             tz = 'UTC' if settings.USE_TZ else settings_dict.get('TIME_ZONE')
             if tz:
-                self.connection.set_isolation_level(
-                        psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
-                self.connection.cursor().execute("SET TIME ZONE %s", [tz])
+                try:
+                    get_parameter_status = self.connection.get_parameter_status
+                except AttributeError:
+                    # psycopg2 < 2.0.12 doesn't have get_parameter_status
+                    conn_tz = None
+                else:
+                    conn_tz = get_parameter_status('TimeZone')
+
+                if conn_tz != tz:
+                    # Set the time zone in autocommit mode (see #17062)
+                    self.connection.set_isolation_level(
+                            psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
+                    self.connection.cursor().execute("SET TIME ZONE %s", [tz])
             self.connection.set_isolation_level(self.isolation_level)
             self._get_pg_version()
             connection_created.send(sender=self.__class__, connection=self)

Modified: django/trunk/docs/ref/databases.txt
===================================================================
--- django/trunk/docs/ref/databases.txt 2011-12-11 01:00:41 UTC (rev 17193)
+++ django/trunk/docs/ref/databases.txt 2011-12-11 08:19:04 UTC (rev 17194)
@@ -33,6 +33,26 @@
 .. _known to be faulty: 
http://archives.postgresql.org/pgsql-bugs/2007-07/msg00046.php
 .. _Release 8.2.5: 
http://developer.postgresql.org/pgdocs/postgres/release-8-2-5.html
 
+Optimizing PostgreSQL's configuration
+-------------------------------------
+
+Django needs the following parameters for its database connections:
+
+- ``client_encoding``: ``'UTF8'``,
+- ``default_transaction_isolation``: ``'read committed'``,
+- ``timezone``: ``'UTC'`` when :setting:`USE_TZ` is ``True``, value of
+  :setting:`TIME_ZONE` otherwise.
+
+If these parameters already have the correct values, Django won't set them for
+every new connection, which improves performance slightly. You can configure
+them directly in :file:`postgresql.conf` or more conveniently per database
+user with `ALTER ROLE`_.
+
+Django will work just fine without this optimization, but each new connection
+will do some additional queries to set these parameters.
+
+.. _ALTER ROLE: 
http://www.postgresql.org/docs/current/interactive/sql-alterrole.html
+
 Transaction handling
 ---------------------
 
@@ -48,9 +68,8 @@
 
 If your application is particularly read-heavy and doesn't make many
 database writes, the overhead of a constantly open transaction can
-sometimes be noticeable. For those situations, if you're using the
-``postgresql_psycopg2`` backend, you can configure Django to use
-*"autocommit"* behavior for the connection, meaning that each database
+sometimes be noticeable. For those situations, you can configure Django
+to use *"autocommit"* behavior for the connection, meaning that each database
 operation will normally be in its own transaction, rather than having
 the transaction extend over multiple operations. In this case, you can
 still manually start a transaction if you're doing something that

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to