Я программирую многопоточное приложение, используя 10 потоков, каждый из которых создает сеанс в начале al oop и уничтожает его в конце:
try:
ss = Session()
...
ss.add_all(object_matches) # list of objects to add to the database
ss.commit()
finally:
ss.close()
Моя проблема - ошибки SQLEndTran
и SQLExecDirectW
(см. Ниже), которые происходят, по-видимому, случайным образом с моим сервером MS SQL. Я прочитал документы для описания соответствующего кода ошибки (0x20
), но создание движка с pool_pre_ping=True
не решает проблему:
engine = create_engine("mssql+pyodbc://sa:P@ssw0rd@localhost:1433/watchdog?driver=ODBC+Driver+17+for+SQL+Server", pool_size=20, max_overflow=10, pool_pre_ping=True, echo=False)
Также не могут настройки autocommit=True
: ss = Session(autocommit=True)
В качестве возможного решения я commit()
повторяюсь в al oop и создаю исключение, только если это происходит три раза:
for i in range(3):
try:
ss.add_all(object_matches)
ss.commit()
except Exception as e:
if i == 2: raise e
else:
break
Это правильный способ справиться с этими ошибками или как мне их исправить?
Примечание. Я использую MS SQL с использованием Docker образа: mcr.microsoft.com/mssql/server
.
SQLEndTran :
ERROR -- 04/09/2020 09:43:04 AM -- sqlalchemy.pool.impl.QueuePool -- ThreadPoolExecutor-0_6 -- Exception during reset or similar
Traceback (most recent call last):
File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 733, in _rollback_impl
self.engine.dialect.do_rollback(self.connection)
File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 538, in do_rollback
dbapi_connection.rollback()
pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x20 (32) (SQLEndTran)')
SQLExecDirectW :
ERROR -- 04/09/2020 09:43:55 AM -- root -- ThreadPoolExecutor-0_2 -- (pyodbc.OperationalError) ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x20 (32) (SQLExecDirectW)')
[SQL: INSERT INTO objects (id, version, type, rest_url, space_id, title, created_by, created_time, modified_by, modified_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
[parameters: (('335810454', 1, 'attachment', 'https://confluence.danskenet.net/rest/api/content/335810454', 36831243, 'DPO Article 32 Assessment Digital Signing.pdf', 'BD7863', datetime.datetime(2020, 4, 7, 16, 14, 26, 727000, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200))), 'BD7863', datetime.datetime(2020, 4, 7, 16, 14, 26, 727000, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)))), ('254106314', 23, 'page', 'https://confluence.danskenet.net/rest/api/content/254106314', 36831243, 'Cloud 2 Front End Assessment 2019-2020', 'BD7863', datetime.datetime(2019, 11, 13, 9, 48, 40, 323000, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600))), 'BD7863', datetime.datetime(2020, 4, 7, 16, 15, 14, 907000, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)))))]
(Background on this error at: http://sqlalche.me/e/e3q8)
Traceback (most recent call last):
File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1228, in _execute_context
cursor, statement, parameters, context
File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/pyodbc.py", line 413, in do_executemany
cursor, statement, parameters, context=context
File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 585, in do_executemany
cursor.executemany(statement, parameters)
pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x20 (32) (SQLExecDirectW)')