Быстрое соединение с SQL Server с помощью pyodbc - PullRequest
1 голос
/ 25 апреля 2019

Я получаю данные json с шины обмена сообщениями и выгружаю этот json в базу данных. Я неплохо работал с psycopg2, делающим ~ 3000 записей в секунду в postgres. По ряду причин мы с тех пор перешли на SQL Server 2016, и мои записи упали примерно до 100 в секунду.

У меня есть функция с именем insert_into (), которая вставляет json в базу данных. Все, что я действительно сделал с моей функцией insert_into (), это изменил библиотеку на pyodbc и строку подключения. Кажется, что мое замедление связано с настройкой, а затем разрывом соединения при каждом вызове моей функции ('conn' в приведенном ниже коде). Если я переместу строку, которая устанавливает соединение, за пределы моей функции insert_into, моя скорость вернется. Мне просто интересно две вещи:

  1. Как правильно настроить такие подключения с точки зрения SQL Server?
  2. Это даже лучший способ сделать это в postrgres?

Для SQL Server сервер 2016, использует драйвер 17 ODBC, аутентификация SQL.

Медленно для SQL Server:

def insert_into():
    conn = None
    try:
        conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=server1;DATABASE=json;UID=user;PWD=pass')
        cur = conn.cursor()
        for i in buffer_list:
            command = 'INSERT INTO jsonTable (data) VALUES (%s)' % ("'" + i + "'")
            cur.execute(command)
        cur.close()
        conn.commit()
    except (Exception, pyodbc.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

Fast для SQL Server:

conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=server1;DATABASE=json;UID=user;PWD=pass')

def insert_into():
    #conn = None
    try:
        cur = conn.cursor()
        for i in buffer_list:
            command = 'INSERT INTO jsonTable (data) VALUES (%s)' % ("'" + i + "'")
            cur.execute(command)
        cur.close()
        conn.commit()
    except (Exception, pyodbc.DatabaseError) as error:
        print(error)

This daemon runs 24/7 and any advice on setting up a fast connection to MSSQL will be greatly appreciated.
...