6

Mam do czynienia z problemem ze skryptem w języku Python, który łączy się z lustrzanym DB serwera MS SQL. Występuje błąd segmentacji, gdy próbuję połączyć się z bazą danych po raz drugi. Zarówno serwer aplikacji, jak i instancje DB działają w Google Compute Engine.Segfault na drugim połączeniu z pyodbc do mirrored MS SQL Server

Oto niektóre kodu replikowania problem:

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) 

Pierwsze połączenie (c1) się powiedzie, ale drugie połączenie (c2) nie natychmiast segfault. "mydb" znajduje odzwierciedlenie w drugim serwerze (sql-server-02). Użycie nieszynowanej bazy danych lub wyłączenie kopii lustrzanej dla tej bazy danych powoduje jej odebranie.

Próbowaliśmy zaktualizować kilka bibliotek, a to nie rozwiązało problemu. Wersje:

  • Microsoft SQL Server: 12.00.2000 (najnowsza)
  • Python: 2.7.6
  • pyodbc: 3.0.10 (najnowsza)
  • unixODBC: 2.2.14p2-5ubuntu5, 2,3 0,0, 2.3.4 (najnowsza)
  • kierowca MS ODBC dla RedHat: 11.0.1790.0, 11.0.2270.0 (najnowsza)

tu dodać, kod Java, wykonując te same czynności, działa bez zarzutu.

Wszelkie pomysły?

Odpowiedz

3

Sterownik MSODBC ma wiele znanych problemów, w szczególności z wielowątkowością. Wygląda na to, że w to wplątujesz. Wpadłem na to z serwerem Django; to działałoby tylko (i wciąż z błędami w SQLRowCount) z opcją --nothreading dla runserver Django.

Na szczęście Microsoft gromadzi teraz zespół, który ma sprawniej działający, niezawodny sterownik (dziękuję, MS!). W międzyczasie używam FreeTDS 0.95 (który obsługuje TDS w wersji 7.3, a la SQL Server 2008), który bardzo dobrze mnie traktował. Spróbować? Powodzenia.

+0

Dzięki za odpowiedź. W rzeczywistości używaliśmy FreeTDS do czasu opublikowania przez MS własnego sterownika; zmiana jest możliwa, chociaż będziemy musieli rozważyć zalety i wady. Czy są jakieś linki na temat nowego wysiłku kierowcy MS? –

+1

MS przyznało, że jakość ich kierowców jest niska; Oto link do dyskusji: https://groups.google.com/forum/#!topic/django-developers/FbBcUCzrSZo Spotkanie w tym tygodniu odbywa się w Seattle z niektórymi ludźmi, którzy pracowali najbliżej Django Obsługa SQL Server. – FlipperPA

-1

Jest to znany problem występujący w niektórych wersjach MS ODBC + unixODBC. Aktualizacja do wersji UnixODBC-2.3.2 i najnowszego sterownika MS ODBC rozwiązuje problem w niektórych dystrybucjach systemu Linux, np. Ubuntu i Debian. Możesz wykonać następujące kroki w celu aktualizacji: https://blog.afoolishmanifesto.com/posts/install-and-configure-the-ms-odbc-driver-on-debian/ Rozwiązał problem z podwójnym połączeniem - można otworzyć wiele połączeń bez uszkodzenia.

To samo uaktualnienie/kroki nie działały dla mnie w RedHat 7.1, chociaż - nadal otrzymujesz segfault na otwarcie połączenia dwa razy w tej samej sesji.