In non-threaded, non-pooled mode connections get not garbage collected with MySQLdb for some reason unknown to me. This patch explicitly closes connections and reduces load a bit by reusing the same connections for all db activity of one type. --- MiddleKit/Run/SQLObjectStore.py.orig Sun Nov 2 12:14:49 2003 +++ MiddleKit/Run/SQLObjectStore.py Sun Nov 2 12:35:27 2003 @@ -189,15 +189,17 @@ def commitInserts(self,allThreads=0): unknownSerialNums = [] + conn = self.newConnection() for object in self._newObjects.items(allThreads): - self._insertObject(object, unknownSerialNums) + self._insertObject(object, unknownSerialNums, conn) + conn.close() for unknownInfo in unknownSerialNums: stmt = unknownInfo.updateStmt() self.executeSQL(stmt) self._newObjects.clear(allThreads) - def _insertObject(self, object, unknownSerialNums): + def _insertObject(self, object, unknownSerialNums, connection=None): # New objects not in the persistent store have serial numbers less than 1 if object.serialNum()>0: try: @@ -208,10 +210,11 @@ # SQL insert sql = object.sqlInsertStmt(unknownSerialNums) - conn, cur = self.executeSQL(sql) + conn, cur = self.executeSQL(sql, connection) # Get new id/serial num idNum = self.retrieveLastInsertId(conn, cur) + # for some reason connections get not garbage collected without this # Update object object.setSerialNum(idNum) @@ -227,17 +230,21 @@ raise AbstractError, self.__class__ def commitUpdates(self,allThreads=0): + conn = self.newConnection() for object in self._changedObjects.values(allThreads): sql = object.sqlUpdateStmt() - self.executeSQL(sql) + self.executeSQL(sql, connection=conn) object.setChanged(0) self._changedObjects.clear(allThreads) + conn.close() def commitDeletions(self,allThreads=0): + conn = self.newConnection() for object in self._deletedObjects.items(allThreads): sql = object.sqlDeleteStmt() - self.executeSQL(sql) + self.executeSQL(sql, connection=conn) self._deletedObjects.clear(allThreads) + conn.close() ## Fetching ##