6

Sono di fronte a un problema con uno script Python che si collega a un DB del server MS SQL con mirroring. Sta generando un errore di segmentazione quando provo a connettermi al DB per la seconda volta. Sia il server dell'app sia le istanze DB sono in esecuzione su Google Compute Engine.Segfault sulla seconda connessione con pyodbc su MS SQL Server con mirroring

Ecco po 'di codice replicare il problema:

import pyodbc 

params = { 
    'autocommit': True, 
    'uid': 'myuser', 
    'tds_version': '8.0', 
    'DRIVER': '{mssql}', 
    'pwd': 'mypassword', 
    'server': 'sql-server-01', 
    'database': 'mydb', 
    'port': 1433, 
} 

c1 = pyodbc.connect(**params) 
c2 = pyodbc.connect(**params) 

La prima connessione (c1) ha successo, ma la seconda connessione (c2) non riesce immediatamente con segmentation fault. "mydb" è speculare su un secondo server (sql-server-02). L'utilizzo di un DB senza mirroring o la disabilitazione del mirroring per questo DB lo fanno andare via.

Abbiamo provato ad aggiornare diverse librerie e questo non ha risolto il problema. Versioni:

  • Microsoft SQL Server: 12.00.2000 (ultimo)
  • Python: 2.7.6
  • pyodbc: 3.0.10 (più recente)
  • unixODBC: 2.2.14p2-5ubuntu5, 2.3 0,0, 2.3.4 (l'ultima)
  • driver per MS ODBC per RedHat: 11.0.1790.0, 11.0.2270.0 (ultima)

per aggiungere qui, il codice Java di eseguire la stessa procedura funziona bene.

Qualche idea?

risposta

3

Il driver MSODBC presenta numerosi problemi noti, in particolare con il multithreading. Sembra che ti stia imbattendo in questo. Mi sono imbattuto in esso con il runserver di Django; funzionerebbe solo (e ancora con bug in SQLRowCount) con l'opzione --nothreading per il server di corse di Django.

Fortunatamente, Microsoft sta ora assemblando un team per realizzare un driver affidabile e performante (grazie, MS!). Nel frattempo, utilizzo FreeTDS 0.95 (che supporta fino a TDS versione 7.3, a la SQL Server 2008), che mi ha trattato molto bene. Provaci? In bocca al lupo.

+0

Grazie per la risposta. In effetti, abbiamo utilizzato FreeTDS fino a quando MS non ha pubblicato il proprio driver; il passaggio è possibile, anche se dovremo pesare pro e contro. Ci sono dei collegamenti sul nuovo sforzo del driver della MS? –

+1

MS ha ammesso che la qualità del driver è scarsa; ecco un link alla discussione: https://groups.google.com/forum/#!topic/django-developers/FbBcUCzrSZo L'incontro sta effettivamente accadendo a Seattle questa settimana con alcune delle persone che hanno lavorato più da vicino su Django Supporto SQL Server. – FlipperPA

-1

Si tratta di un problema noto in alcune versioni di MS ODBC + unixODBC. Con l'aggiornamento a unixODBC-2.3.2 e l'ultimo driver MS ODBC, risolve il problema su alcune distribuzioni di linux, ad es. ubuntu e debian. È possibile seguire i passaggi per l'aggiornamento qui: https://blog.afoolishmanifesto.com/posts/install-and-configure-the-ms-odbc-driver-on-debian/ ha risolto il problema di doppia connessione - può aprire più connessioni senza segfaulting.

Lo stesso aggiornamento/passaggi non ha funzionato per me su RedHat 7.1: si ottiene comunque un segfault sull'apertura di una connessione due volte nella stessa sessione.

Problemi correlati