Commits

Mike Bayer committed 5704d9d

- The per-dialect cache used by TypeEngine to cache
dialect-specific types is now a WeakKeyDictionary.
This to prevent dialect objects from
being referenced forever for an application that
creates an arbitrarily large number of engines
or dialects. There is a small performance penalty
which will be resolved in 0.6. [ticket:1299]

  • Participants
  • Parent commits 57aa3ae
  • Branches rel_0_4

Comments (0)

Files changed (3)

     - NullPool supports reconnect on failure behavior.
       [ticket:1094]
 
+    - The per-dialect cache used by TypeEngine to cache
+      dialect-specific types is now a WeakKeyDictionary.
+      This to prevent dialect objects from 
+      being referenced forever for an application that 
+      creates an arbitrarily large number of engines
+      or dialects.   There is a small performance penalty
+      which will be resolved in 0.6.  [ticket:1299]
+      
 - postgres
     - Added Index reflection support to Postgres, using a
       great patch we long neglected, submitted by 

File lib/sqlalchemy/types.py

 
 import inspect
 import datetime as dt
-
+import weakref
 from sqlalchemy import exceptions
 from sqlalchemy.util import pickle, Decimal as _python_Decimal
 import sqlalchemy.util as util
         try:
             return self._impl_dict[dialect]
         except AttributeError:
-            self._impl_dict = {}
+            self._impl_dict = weakref.WeakKeyDictionary()   # will be optimized in 0.6
             return self._impl_dict.setdefault(dialect, dialect.type_descriptor(self))
         except KeyError:
             return self._impl_dict.setdefault(dialect, dialect.type_descriptor(self))
 
     def __getstate__(self):
         d = self.__dict__.copy()
-        d['_impl_dict'] = {}
+        d['_impl_dict'] = weakref.WeakKeyDictionary()   # will be optimized in 0.6
         return d
 
     def get_col_spec(self):
         try:
             return self._impl_dict[dialect]
         except AttributeError:
-            self._impl_dict = {}
+            self._impl_dict = weakref.WeakKeyDictionary()   # will be optimized in 0.6
         except KeyError:
             pass
 

File test/orm/memusage.py

 from sqlalchemy.orm import mapper, relation, clear_mappers, create_session
 from sqlalchemy.orm.mapper import Mapper, _mapper_registry
 from sqlalchemy.orm.session import _sessions 
+import sqlalchemy as sa
+from sqlalchemy.sql import column
 from testlib import *
 from testlib.fixtures import Base
 
             metadata.drop_all()
         assert_no_mappers()
 
-
+    def test_type_compile(self):
+        from sqlalchemy.databases.sqlite import SQLiteDialect
+        cast = sa.cast(column('x'), sa.Integer)
+        @profile_memory
+        def go():
+            dialect = SQLiteDialect()
+            cast.compile(dialect=dialect)
+        go()
+        
 if __name__ == '__main__':
     testenv.main()