Skip to content

Commit a15d3b5

Browse files
newmanieseakaariai
authored andcommitted
[1.3.x] Fixed django#18135 -- Close connection used for db version checking
On MySQL when checking the server version, a new connection could be created but never closed. This could result in open connections on server startup. Backport of 4423757.
1 parent e293d82 commit a15d3b5

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

django/db/backends/mysql/base.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,19 @@ def _rollback(self):
334334

335335
def get_server_version(self):
336336
if not self.server_version:
337+
new_connection = False
337338
if not self._valid_connection():
338-
self.cursor()
339-
m = server_version_re.match(self.connection.get_server_info())
339+
# Ensure we have a connection with the DB by using a temporary
340+
# cursor
341+
new_connection = True
342+
self.cursor().close()
343+
server_info = self.connection.get_server_info()
344+
if new_connection:
345+
# Make sure we close the connection
346+
self.connection.close()
347+
self.connection = None
348+
m = server_version_re.match(server_info)
340349
if not m:
341-
raise Exception('Unable to determine MySQL version from version string %r' % self.connection.get_server_info())
350+
raise Exception('Unable to determine MySQL version from version string %r' % server_info)
342351
self.server_version = tuple([int(x) for x in m.groups()])
343352
return self.server_version

tests/regressiontests/backends/tests.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ def test_client_encoding(self):
5656
self.assertEqual(connection.connection.encoding, "UTF-8")
5757
self.assertEqual(connection.connection.nencoding, "UTF-8")
5858

59+
class MySQLTests(TestCase):
60+
@unittest.skipUnless(connection.vendor == 'mysql',
61+
"Test valid only for MySQL")
62+
def test_server_version_connections(self):
63+
connection.close()
64+
connection.get_server_version()
65+
self.assertTrue(connection.connection is None)
66+
5967
class DateQuotingTest(TestCase):
6068

6169
def test_django_date_trunc(self):

0 commit comments

Comments
 (0)