I was writing a service which import various feeds and then post to another RESTful API, simple enough as below:
from django.db import connections
class Receiver(PolymorphicModel):
...
class Database(Receiver):
name = models.CharField(max_length=255)
def get_data_source(self):
return connections[name]
Then the feed model:
class Feed(models.Model):
receiver = models.ForeignKey('Receiver')
def get_data_source(self):
return self.receiver.get_real_instance().get_data_source()
Then run this feed in trivial code:
import threading
function transform_listing(feed):
cursor = feed.get_data_source().cursor()
....
feed = Feed.objects.create(receiver=Database.objects.create(name='legacy'))
for i in range(100):
th = threading.Thread(transform_listing, [feed])
th.start()
And you will quickly notice the threads complaining
Too many connections
What it’s happening is Django will create a new connection per thread when you access the ORM, and connections are left open even the threads are terminated, in this case the culprit is
def get_data_source(self):
return self.receiver.get_real_instance().get_data_source()
So in this case, simply refactor the code to close the connection before return:
from django.db import connection
...
def get_data_source(self):
result = self.receiver.get_real_instance().get_data_source()
connection.close()
return result