как повторно подключиться к MS SQL после спящего режима (S4) (или отброшенного соединения)?

я запускаю некоторые тесты гибернации с помощью python + microsoft утилиты pwrtest

также я использую sqlalchemy (orm) для работы с базой данных (ms sql server 2008 r2).

Я подключен к удаленному sql server, и все работает штрафы, однако после того, как компьютер переходит в режим гибернации (S4) sql server сбрасывает соединение (я вижу его как "монитор активности" в management studio).

когда мой компьютер вернется к спящий режим и продолжается со скриптом, я получаю сообщение об ошибке"DBAPIError: (ошибка) ('08S01', '[08S01] [Microsoft][драйвер ODBC для SQL-сервера]ошибка соединения (0) (SQLExecDirectW)')"

Я пытался использовать pool_recycle

engine = create_engine(settings.sql_engine, echo=True, pool_recycle=1)

однако, насколько я понимаю sqlalchemy не понимает, что соединение больше не существует.

Я также пытался использовать engine.dispose() и по документация он должен упасть текущий пул:

утилизируйте пул соединений, используемый этим движком.

новый пул соединений создается сразу после того, как старый удаляются. Этот новый пул, как и все пулы соединений SQLAlchemy, не делает никаких фактических подключений к базе данных, пока не будет первая просьба.

но это тоже не работает

Как подключиться к базе данных?

спасибо!

в код:

#module db.py:
from sqlalchemy.ext.declarative import declarative_base , declared_attr
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker, relationship, backref
from sqlalchemy.orm.exc import *

Base = declarative_base()

class Drive(Base):
    __tablename__ = "drives"

    id = Column(Integer, primary_key=True)
    isPhysical = Column(Boolean)
    devicePath = Column(String(100))
    name = Column(String(10))
    encrypted = Column(Boolean, default=False)
    size = Column(BigInteger)

    def __init__(self):
        pass        

sql_engine = 'mssql+pyodbc://Tester:Password@sql-server/Automation'
engine = create_engine(sql_engine, echo=True)
Session = sessionmaker(bind=engine)
Base.metadata.create_all(engine)

реальный вызов:

#hibernation.py

from db import *
import subprocess

command = r"pwrtest /sleep /s:4 /h:n /c:1"

out = subprocess.check_output(command)
# hibernation occurs

session = Session()

session.query(Drive).all()

1 ответов


вы можете попробовать эту "пессимистическую обработку разъединения":

http://docs.sqlalchemy.org/en/rel_0_7/core/pooling.html#disconnect-handling-pessimistic