【问题标题】:how to reconnect with MS SQL after hibernation (S4) (or dropped connection)?如何在休眠(S4)(或断开连接)后重新连接 MS SQL?
【发布时间】:2012-08-15 16:33:57
【问题描述】:

我正在使用 python + microsoft 的 pwrtest utility 运行一些休眠测试

我也在使用 sqlalchemy (orm) 来处理数据库 (ms sql server 2008 r2)。

我已连接到远程 sql 服务器,一切正常,但是在计算机进入休眠模式 (S4) 后,sql 服务器断开连接(我将其视为管理工作室的“活动监视器”)。

当我的电脑恢复休眠并继续执行脚本时,我收到错误“DBAPIError: (Error) ('08S01', '[08S01] [Microsoft][ODBC SQL Server Driver]Communication link failure ( 0) (SQLExecDirectW)')"

我尝试使用pool_recycle

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

但是,据我了解,sqlalchemy 并没有意识到连接不再存在。

我也尝试过使用engine.dispose(),根据documentation,它应该删除当前池:

释放此引擎使用的连接池。

在旧连接池完成后立即创建一个新连接池 被处置。这个新池,像所有 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()

【问题讨论】:

    标签: python sqlalchemy database-connection


    【解决方案1】:

    【讨论】:

    • 谢谢。并且确实添加了监听器,但是它为所有提交添加了额外的查询。我需要的是在特定情况下重新建立连接的一次性事情。到目前为止,我还没有找到比在新引擎上再次调用 create_enginesessionmaker 更好的方法 :(
    • 我想知道是否有办法触发像raise exc.DisconnectionError() 这样的东西,所以引擎会自行重新连接。
    • Alex,你找到好的解决方案了吗?我在怀疑网络问题的设置之一中遇到了同样的问题。
    • @agilevic,我最终使用了建议的解决方案。它工作正常。
    • 链接已损坏。请将链接更新为“断开连接处理 - 悲观”docs.sqlalchemy.org/en/latest/core/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2019-02-22
    • 2013-11-24
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多