Hari wrote: > > You are right, the problem is with the driver. I found an updated > version and installing it fixed the problem. Thanks for helping > resolve the problem. > > I was actually making sure that the GC actually returns the connection > back, and it does work as expected. However, in the code I haven't > seen a __del__() being implemented in _ConnectionFairy or _CursorFairy > classes so wondering how this actually works. Am I looking at the > correct location of code?
it doesn't use __del__ which interferes with gc and also presents "self" in a non-deterministic state. a remote weakref with a callback is used to finalize connection resources back into the pool. > > On Jul 9, 6:08 pm, Michael Bayer <[email protected]> wrote: >> nothing known there. Try removing the pool part of the equation. >> seems like your ODBC driver has issues. >> >> On Jul 9, 7:42 pm, Hari <[email protected]> wrote: >> >> > I just started trying the connection pooling and got this error when I >> > was trying to see how good it can detect garbage collection. This is >> > the sequence of operations I performed via iPython (on sql server via >> > pyodbc): >> >> > -------------------------------------------------------------------------------- >> > import sqlalchemy.pool >> > import pyodbc >> > pyodbc = sqlalchemy.pool.manage(pyodbc, pool_size=1, max_overflow=1) >> > dbstring = 'DRIVER={SQL Native Client};SERVER=%s,%s;DATABASE=%s;UID= >> > %s;PWD=%s' >> > c = pyodbc.connect(dbstring % ("localhost", 1433, "master", >> > "username", "password")) >> > c = None >> > import db >> > import gc >> > gc.collect() >> > c = pyodbc.connect(dbstring % ("localhost", 1433, "master", >> > "username", "password")) >> > c2 = pyodbc.connect(dbstring % ("localhost", 1433, "master", >> > "username", "password")) >> > c = None >> > c2 = None >> > gc.collect() >> > c = pyodbc.connect(dbstring % ("localhost", 1433, "master", >> > "username", "password")) >> > c2 = pyodbc.connect(dbstring % ("localhost", 1433, "master", >> > "username", "password")) >> > -------------------------------------------------------------------------------- >> >> > After the last statement, I got the below error: >> >> > -------------------------------------------------------------------------------- >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in connect >> > (self, *args, **params) >> > 907 """ >> > 908 >> > --> 909 return self.get_pool(*args, **params).connect() >> > 910 >> > 911 def dispose(self, *args, **params): >> >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in connect >> > (self) >> > 140 def connect(self): >> > 141 if not self._use_threadlocal: >> > --> 142 return _ConnectionFairy(self).checkout() >> > 143 >> > 144 try: >> >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in __init__ >> > (self, pool) >> > 302 self.__counter = 0 >> > 303 try: >> > --> 304 rec = self._connection_record = pool.get() >> > 305 conn = self.connection = >> > self._connection_record.get_connection() >> > 306 self._connection_record.backref = weakref.ref >> > (self, lambda ref:_finalize_fairy(conn, rec, pool, ref)) >> >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in get(self) >> > 159 >> > 160 def get(self): >> > --> 161 return self.do_get() >> > 162 >> > 163 def do_get(self): >> >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in do_get(self) >> > 637 >> > 638 try: >> > --> 639 con = self.create_connection() >> > 640 self._overflow += 1 >> > 641 finally: >> >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in >> > create_connection(self) >> > 120 >> > 121 def create_connection(self): >> > --> 122 return _ConnectionRecord(self) >> > 123 >> > 124 def recreate(self): >> >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in __init__ >> > (self, pool) >> > 196 def __init__(self, pool): >> > 197 self.__pool = pool >> > --> 198 self.connection = self.__connect() >> > 199 self.info = {} >> > 200 if pool._on_connect: >> >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in __connect >> > (self) >> > 259 try: >> > 260 self.starttime = time.time() >> > --> 261 connection = self.__pool._creator() >> > 262 if self.__pool._should_log_info: >> > 263 self.__pool.log("Created new connection %r" % >> > connection) >> >> > C:\apps\Python24\lib\site-packages\sqlalchemy\pool.pyc in <lambda>() >> > 886 try: >> > 887 if key not in self.pools: >> > --> 888 pool = self.poolclass(lambda: >> > self.module.connect(*args, **params), **self.params) >> > 889 self.pools[key] = pool >> > 890 return pool >> >> > Error: ('IM006', "[IM006] [Microsoft][ODBC Driver Manager] Driver's >> > SQLSetConnectAttr failed (0); [01000] [Microsoft][SQL Native Client] >> > [SQL Server]Changed database context to 'dsmaster'. (5701); [01000] >> > [Microsoft][SQL Native Client][SQL Server]Changed language setting to >> > us_english. (5703)") >> > -------------------------------------------------------------------------------- >> >> > Is this a known problem with the pool or something is wrong with the >> > usage? Thank you. >> >> > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
