【问题标题】:db connection in pythonpython中的数据库连接
【发布时间】:2010-10-26 09:56:40
【问题描述】:

我正在用 python 编写代码,在其中建立了与数据库的连接。我有一个循环的查询。在循环中执行查询时,如果我拔下网络电缆,它应该停止并出现异常。但这不会发生,当我在 2 分钟后再次插入网络电缆时,它会从结束的地方重新开始。我正在使用 linux 和 psycopg2。它没有显示异常

【问题讨论】:

  • 大喊“急需帮助”可能不是获得同情的最佳方式。

标签: python tcp database-connection


【解决方案1】:

您的数据库连接几乎肯定会基于 TCP 套接字。 TCP 套接字将在失败和(在 python 中)引发异常之前重试很长时间。更不用说在数据库层重试/自动重新连接尝试。

【讨论】:

    【解决方案2】:

    正如道格拉斯的回答所说,它不会因 TCP 引发异常。

    您可以尝试使用 socket.setdefaulttimeout() 来设置更短的超时值。

    设置默认超时(...)

       setdefaulttimeout(timeout)
    
       Set the default timeout in floating seconds for new socket objects.
       A value of None indicates that new socket objects have no timeout.
       When the socket module is first imported, the default is None.
    

    但是,如果你的数据库连接不是通过python socket建立的,例如native socket,它可能不起作用。

    【讨论】:

      【解决方案3】:

      如果您想实现无论客户端库如何连接到服务器都有效的超时,最好在单独的线程中尝试 DB 操作,或者更好的是,在单独的进程中进行“监控”线程/如果需要,进程可以终止;请参阅 Python 2.6 标准库中的多处理模块(如果需要,有 2.5 的反向移植版本)。一个进程更好,因为当它被杀死时,操作系统会负责释放和清理资源,而杀死一个线程总是一件非常不安全和混乱的事情。

      【讨论】:

      • 你能详细解释一下吗
      • 首先阅读docs.python.org/library/multiprocessing.html,它解释了如何在标准库中使用多处理模块(2.6 或更高版本的 Python;如果您使用的是 2.5,请从 code.google.com/p 安装 backport /python-多处理/)。评论中没有太多空间可以提供更多详细信息,但想法是:创建两个队列 quin 和 quout,使用队列创建一个进程,当您需要 SQL 查询将其推送到 quin 时,进程等待该队列,拉出查询,执行,将结果推送到 quout;如果时间过长,请求进程会杀死另一个进程。
      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2013-10-03
      • 2015-12-26
      相关资源
      最近更新 更多