2012-08-15 2 views
6

Ich bin mit ein paar Winterschlaf Tests mit Python + pwrtest utilityWie man mit MS SQL nach dem Ruhezustand (S4) (oder gelöschte Verbindung) wieder verbindet?

Auch Microsofts Ich verwende sqlalchemy (ORM) mit Datenbank (MS SQL Server 2008 r2) zu arbeiten.

Ich bin mit dem Remote-SQL-Server verbunden und alles funktioniert Feinheiten, aber nach dem Computer in den Ruhezustand Modus (S4) sql Server die Verbindung (ich sehe es als "Activity-Monitor" im Management Studio).

Wenn mein PC wieder für den Ruhezustand wird und setzt sich mit dem Skript, das ich den Fehler "DBAPIError: (Fehler) ('08S01',‚[08S01] [Microsoft] [ODBC SQL Server Driver] Kommunikationsverbindungsfehler (0) (SQLExecDirectW) ') "

ich habe versucht, die pool_recycle

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

jedoch so weit zu verwenden, wie ich sqlalchemy verstehen nicht erkennen, dass die Verbindung nicht mehr existiert.

Ich habe auch zu verwenden engine.dispose() und nach dem documentation versuchte er den aktuellen Pool fallen sollte:

Dispose of the connection pool used by this Engine.

A new connection pool is created immediately after the old one has been disposed. This new pool, like all SQLAlchemy connection pools, does not make any actual connections to the database until one is first requested.

Aber das auch nicht funktioniert hat

Wie der Datenbank zu verbinden?

Danke!

Der Code:

#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:[email protected]/Automation' 
engine = create_engine(sql_engine, echo=True) 
Session = sessionmaker(bind=engine) 
Base.metadata.create_all(engine) 

eigentlichen Aufruf:

#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() 

Antwort

3

können Sie versuchen, dieses "Pessimistische Disconnect Handling":

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

+0

Dank. Und tatsächlich hat das Hinzufügen des Zuhörers funktioniert, jedoch werden zusätzliche Abfragen für alle Commits eingefügt. Was ich brauche, ist eine einmalige Sache, um die Verbindung nach einer bestimmten Situation wiederherzustellen. Bisher habe ich nichts besseres gefunden, als 'create_engine' und' sessionmaker' auf der neuen Engine erneut aufzurufen :( –

+0

Ich frage mich, ob es eine Möglichkeit gibt, etwas wie 'raise exc.DisconnectionError()' auszulösen, also die Engine verbindet sich selbst. –

+0

Alex, haben Sie eine gute Lösung gefunden? Ich habe das gleiche Problem mit einem unserer Setups, wo wir Netzwerkprobleme vermuten. –