> > > the code here isn’t really showing me the nature of the two separate > connections. They will be different unless you’re using “threadlocal” on > the engine or pool and both are in the same thread. A simple comparison of > the “raw” DBAPI connections to see if they are different objects will > suffice (make sure you’re on the ultimate DBAPI connection though, not the > “fairy” object). However note that Microsoft ODBC drivers also feature > connection pooling, so you’d need to turn it off at the ODBC configuration > level as well. >
Hopefully the following details will help. Here is the sanitized code and logs: class QueryObj (object): #blah blah def select (qry, other params): #This is simplified from the real code eng = get_engine() #Threadsafe method to get engine raw_con = eng.connect().connection.connection logger.debug("Raw connection %s" % raw_con) crsr = raw_con.cursor() logger.debug("Cursor: %s" % cursor) raw_con.autocommit= True res = crsr.execute (qry, *multiparams) #multiparams is empty here raw_con.autocommit= False res_fetched = res.fetchall() res.close() class ParTest (Thread): def __init__(self): Thread.__init__(self) def run (self): q = QueryObj (My params) for _ in range(5): try: resultset= q.select("My query which takes a few seconds", other params like Db etc.) except Exception: pass def main (): lst = [] for i in range(10): lst.append(ParTest()) for i in range(10): lst[i].start() Here is the log (apologies for the rather lengthy log). The structure of the log statements is: *Thread id - timestamp - level - log statement* 30848 - 2014-05-12 13:05:32,102 - DEBUG - Start query: My query 26188 - 2014-05-12 13:05:32,102 - DEBUG - Start query: My query 30148 - 2014-05-12 13:05:32,102 - DEBUG - Start query: My query 31624 - 2014-05-12 13:05:32,102 - DEBUG - Start query: My query 27788 - 2014-05-12 13:05:32,102 - DEBUG - Start query: My query 30624 - 2014-05-12 13:05:32,102 - DEBUG - Start query: My query 31008 - 2014-05-12 13:05:32,102 - DEBUG - Start query: My query 14832 - 2014-05-12 13:05:32,104 - DEBUG - Start query: My query 22108 - 2014-05-12 13:05:32,102 - DEBUG - Start query: My query 30364 - 2014-05-12 13:05:32,104 - DEBUG - Start query: My query 30848 - 2014-05-12 13:05:32,246 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3870> 30848 - 2014-05-12 13:05:32,246 - DEBUG - Cursor: <pyodbc.Cursor object at 0x0000000004A74B10> 26188 - 2014-05-12 13:05:32,259 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3978> 26188 - 2014-05-12 13:05:32,260 - DEBUG - Cursor: <pyodbc.Cursor object at 0x0000000004A74B70> 31624 - 2014-05-12 13:05:32,272 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED39D0> 31624 - 2014-05-12 13:05:32,273 - DEBUG - Cursor: <pyodbc.Cursor object at 0x0000000004A74C90> 30148 - 2014-05-12 13:05:32,285 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3A28> 30148 - 2014-05-12 13:05:32,286 - DEBUG - Cursor: <pyodbc.Cursor object at 0x0000000004A74BD0> 30624 - 2014-05-12 13:05:32,298 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3A80> 30624 - 2014-05-12 13:05:32,299 - DEBUG - Cursor: <pyodbc.Cursor object at 0x0000000004A74CF0> 27788 - 2014-05-12 13:05:32,358 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3AD8> 31008 - 2014-05-12 13:05:32,358 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3B30> 14832 - 2014-05-12 13:05:32,358 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3B88> 22108 - 2014-05-12 13:05:32,358 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3BE0> 30364 - 2014-05-12 13:05:32,358 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3C38> 27788 - 2014-05-12 13:05:32,359 - ERROR - Error: Attempt to use a closed connection.. Query My query Traceback (most recent call last): File "QueryObj.py", line 503, in execute cursor = raw_con.cursor() ProgrammingError: Attempt to use a closed connection. 31008 - 2014-05-12 13:05:32,359 - ERROR - Error: Attempt to use a closed connection.. Query My query Traceback (most recent call last): File "QueryObj.py", line 503, in execute cursor = raw_con.cursor() ProgrammingError: Attempt to use a closed connection. 14832 - 2014-05-12 13:05:32,361 - ERROR - Error: Attempt to use a closed connection.. Query My query Traceback (most recent call last): File "QueryObj.py", line 503, in execute cursor = raw_con.cursor() ProgrammingError: Attempt to use a closed connection. 22108 - 2014-05-12 13:05:32,361 - ERROR - Error: Attempt to use a closed connection.. Query My query Traceback (most recent call last): File "QueryObj.py", line 503, in execute cursor = raw_con.cursor() ProgrammingError: Attempt to use a closed connection. 30364 - 2014-05-12 13:05:32,362 - ERROR - Error: Attempt to use a closed connection.. Query My query Traceback (most recent call last): File "QueryObj.py", line 503, in execute cursor = raw_con.cursor() ProgrammingError: Attempt to use a closed connection. 27788 - 2014-05-12 13:05:32,365 - ERROR - Error Attempt to use a closed connection. fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e ProgrammingError: Attempt to use a closed connection. 31008 - 2014-05-12 13:05:32,367 - ERROR - Error Attempt to use a closed connection. fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e ProgrammingError: Attempt to use a closed connection. 14832 - 2014-05-12 13:05:32,368 - ERROR - Error Attempt to use a closed connection. fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e ProgrammingError: Attempt to use a closed connection. 22108 - 2014-05-12 13:05:32,368 - ERROR - Error Attempt to use a closed connection. fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e ProgrammingError: Attempt to use a closed connection. 30364 - 2014-05-12 13:05:32,368 - ERROR - Error Attempt to use a closed connection. fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e ProgrammingError: Attempt to use a closed connection. 27788 - 2014-05-12 13:05:32,369 - DEBUG - Start query: My query 31008 - 2014-05-12 13:05:32,371 - DEBUG - Start query: My query 14832 - 2014-05-12 13:05:32,371 - DEBUG - Start query: My query 22108 - 2014-05-12 13:05:32,372 - DEBUG - Start query: My query 30364 - 2014-05-12 13:05:32,374 - DEBUG - Start query: My query 27788 - 2014-05-12 13:05:32,374 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3870> 31008 - 2014-05-12 13:05:32,375 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3978> 14832 - 2014-05-12 13:05:32,375 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED39D0> 22108 - 2014-05-12 13:05:32,375 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3A28> 30364 - 2014-05-12 13:05:32,377 - DEBUG - Raw connection <pyodbc.Connection object at 0x0000000007ED3A80> 27788 - 2014-05-12 13:05:32,377 - DEBUG - Cursor: <pyodbc.Cursor object at 0x00000000080EBF90> 31008 - 2014-05-12 13:05:32,378 - DEBUG - Cursor: <pyodbc.Cursor object at 0x0000000008181030> 14832 - 2014-05-12 13:05:32,378 - DEBUG - Cursor: <pyodbc.Cursor object at 0x0000000008181090> 22108 - 2014-05-12 13:05:32,378 - DEBUG - Cursor: <pyodbc.Cursor object at 0x00000000081810F0> 30364 - 2014-05-12 13:05:32,380 - DEBUG - Cursor: <pyodbc.Cursor object at 0x0000000008181150> 27788 - 2014-05-12 13:05:32,381 - ERROR - Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)'). Query My query on , Traceback (most recent call last): File "QueryObj.py", line 508, in execute res = cursor.execute (qry, *multiparams) Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 31008 - 2014-05-12 13:05:32,381 - ERROR - Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)'). Query My query on , Traceback (most recent call last): File "QueryObj.py", line 508, in execute res = cursor.execute (qry, *multiparams) Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 14832 - 2014-05-12 13:05:32,381 - ERROR - Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)'). Query My query on , Traceback (most recent call last): File "QueryObj.py", line 508, in execute res = cursor.execute (qry, *multiparams) Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 22108 - 2014-05-12 13:05:32,381 - ERROR - Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)'). Query My query on , Traceback (most recent call last): File "QueryObj.py", line 508, in execute res = cursor.execute (qry, *multiparams) Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 30364 - 2014-05-12 13:05:32,382 - ERROR - Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)'). Query My query on , Traceback (most recent call last): File "QueryObj.py", line 508, in execute res = cursor.execute (qry, *multiparams) Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 27788 - 2014-05-12 13:05:32,384 - ERROR - Error ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 31008 - 2014-05-12 13:05:32,384 - ERROR - Error ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 14832 - 2014-05-12 13:05:32,385 - ERROR - Error ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 22108 - 2014-05-12 13:05:32,385 - ERROR - Error ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') 30364 - 2014-05-12 13:05:32,387 - ERROR - Error ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') fetching results. Traceback (most recent call last): File "QueryObj.py", line 999, in select res= execute (selectQry, My params) File "QueryObj.py", line 666, in execute raise e Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)') [Removed log statements] 30848 - 2014-05-12 13:06:40,200 - DEBUG - Finish query: My query [Removed log statements] *What the code does:* The code is simply trying to run in parallel, a query that takes a few seconds to execute. *Notes on the log statements:* For thread id *27788 *- When this thread starts for the first time, it gets the pyodbc connection object at 7ED3AD8. This object is not being used by any other thread, yet it encounters ProgrammingError: Attempt to use a closed connection. *Why would this be?* Later, at 13:05:32,374- thread id 27788 retries. It gets pyodbc connection 7ED3870, and cursor 80EBF90. This pyodbc connection (but not this cursor) was already given to thread id 30848 at 13:05:32,246, and is still in use there. Hence, when 27788 tries to execute a query it runs into: Error: ('HY000', '[HY000] [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt (0) (SQLExecDirectW)'). *It does seem like the error being thrown is legitimate, given that the connection is actually being used elsewhere. I do not understand why the engine.connect() function, when executed by thread id 27788 returns the pyodbc object at 7ED3870, while it is being used in thread id 30848. Is this expected? * My understanding of how this pool works is: 30848 checks out the connection from the pool when it runs the eng.connect() statement. This connection is returned to the pool only when the res.close() statement is run, which is after all the results have been fetched. While the connection has been checked out, the pool should not be giving the same connection to other threads. I also tried turning off the ODBC connection pooling by going to the control panel, that did not help either. Thanks for your help! -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.