Index: django/db/backends/postgresql/base.py
===================================================================
--- django/db/backends/postgresql/base.py	(revision 1735)
+++ django/db/backends/postgresql/base.py	(working copy)
@@ -6,6 +6,8 @@
 
 from django.db.backends import util
 import psycopg as Database
+from threading import currentThread 
+from django.utils.synch import RWLock
 
 DatabaseError = Database.DatabaseError
 
@@ -13,24 +15,32 @@
     def __init__(self):
         self.connection = None
         self.queries = []
+        self._lock = RWLock()
+        self._active_threads = []
 
     def cursor(self):
         from django.conf.settings import DATABASE_USER, DATABASE_NAME, DATABASE_HOST, DATABASE_PORT, DATABASE_PASSWORD, DEBUG, TIME_ZONE
-        if self.connection is None:
-            if DATABASE_NAME == '':
-                from django.core.exceptions import ImproperlyConfigured
-                raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file."
-            conn_string = "dbname=%s" % DATABASE_NAME
-            if DATABASE_USER:
-                conn_string = "user=%s %s" % (DATABASE_USER, conn_string)
-            if DATABASE_PASSWORD:
-                conn_string += " password='%s'" % DATABASE_PASSWORD
-            if DATABASE_HOST:
-                conn_string += " host=%s" % DATABASE_HOST
-            if DATABASE_PORT:
-                conn_string += " port=%s" % DATABASE_PORT
-            self.connection = Database.connect(conn_string)
-            self.connection.set_isolation_level(1) # make transactions transparent to all cursors
+        self._lock.writer_enters()
+        try:
+            if self.connection is None:
+                if DATABASE_NAME == '':
+                    from django.core.exceptions import ImproperlyConfigured
+                    raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file."
+                conn_string = "dbname=%s" % DATABASE_NAME
+                if DATABASE_USER:
+                    conn_string = "user=%s %s" % (DATABASE_USER, conn_string)
+                if DATABASE_PASSWORD:
+                    conn_string += " password='%s'" % DATABASE_PASSWORD
+                if DATABASE_HOST:
+                    conn_string += " host=%s" % DATABASE_HOST
+                if DATABASE_PORT:
+                    conn_string += " port=%s" % DATABASE_PORT
+                self.connection = Database.connect(conn_string)
+                self.connection.set_isolation_level(1) # make transactions transparent to all cursors
+                if not currentThread() in self._active_threads:
+                    self._active_threads.append(currentThread())
+        finally:
+            self._lock.writer_leaves()
         cursor = self.connection.cursor()
         cursor.execute("SET TIME ZONE %s", [TIME_ZONE])
         if DEBUG:
@@ -41,13 +51,23 @@
         return self.connection.commit()
 
     def rollback(self):
-        if self.connection:
-            return self.connection.rollback()
+        self._lock.reader_enters()
+        try:
+            if self.connection:
+                return self.connection.rollback()
+        finally:
+            self._lock.reader_leaves()
 
     def close(self):
-        if self.connection is not None:
-            self.connection.close()
-            self.connection = None
+        self._lock.writer_enters()
+        try:
+            if currentThread() in self._active_threads:
+                self._active_threads.remove(currentThread())
+            if not self._active_threads and self.connection is not None:
+                self.connection.close()
+                self.connection = None
+        finally:
+            self._lock.writer_leaves()
 
 def quote_name(name):
     if name.startswith('"') and name.endswith('"'):
