处理 TCP 提供程序:错误代码 0x68 (104)

Use*_*716 8 python pyodbc

我正在使用此代码将我的数据库与客户端同步:

    import pyodbc

    SYNC_FETCH_ARRAY_SIZE=25000

    # define connection + cursor
    connection = pyodbc.connect()
    cursor = connection.cursor()

    query = 'select some_columns from mytable'
    cursor.execute(query)

    while True:
        rows = cursor.fetchmany(SYNC_FETCH_ARRAY_SIZE) # <<< error here

        if not rows:
            break

        insert_to_our_db(rows)

    cursor.close()
Run Code Online (Sandbox Code Playgroud)

我间歇性地收到以下错误:

File "....py", line 120, in ...
  rows = sg_cur.fetchmany(SYNC_FETCH_ARRAY_SIZE)
pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x68 (104) (SQLGetData)')
Run Code Online (Sandbox Code Playgroud)

我应该如何处理这个错误?这是连接上的错误(因此我需要关闭并重新创建连接)还是光标上的错误,我只需要添加重试?

我将添加以下内容来重试(代替抛出错误的行),这足以解决问题吗?如果我遇到 TCP 错误,重试会有任何影响吗?

File "....py", line 120, in ...
  rows = sg_cur.fetchmany(SYNC_FETCH_ARRAY_SIZE)
pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x68 (104) (SQLGetData)')
Run Code Online (Sandbox Code Playgroud)

编辑:

github 上有一个关于此问题的问题。与此同时,可行的解决方法是什么?

  • 将最后一次读取的内容存储insert_to_our_db在我们的数据库中,然后从那里重新启动,以防出现错误
  • 只需再次运行整个过程

笔记:

  • 该错误是间歇性的,因此很难测试
  • 我正在从不同主机上的客户端数据库同步一个大表。因此我需要立即更新/插入所有行以确保数据是最新的
  • 我无法更改客户端的数据库

Use*_*716 1

我意识到我要插入的表没有索引。

为了添加行,我正在运行更新插入,以避免重复。在表中添加索引解决了我的问题。

看看其他遇到此问题的人,这似乎是公认的解决方案。无论如何,我绝对应该对表格建立索引——吸取教训。

编辑。 我不会接受这个答案,希望有人能够对这个问题有更多的了解。但对我来说,添加索引(加快了交易速度)解决了问题。

  • 您好,您能解释一下为什么索引可以解决这个问题吗?或者为什么一开始就没有一个导致它呢?谢谢。 (4认同)