2

我有一个应用程序通过 TCP 连接接收数据并将其写入 postgres 数据库。然后我使用 django web 前端为这些数据提供 gui。由于 django 提供了有用的数据库访问方法,我的 TCP 接收器也使用 django 模型写入数据库。

我的问题是我需要使用分叉的 TCP 服务器。分叉导致子进程和父进程共享句柄。我读过 Django 不支持分叉,并且确实共享数据库连接会导致问题,例如这些异常:

DatabaseError: SSL 错误: 解密失败或坏记录 mac

接口错误:连接已关闭

使分叉的 TCP 服务器工作的最佳解决方案是什么?

  • 我可以确保分叉的进程使用自己的数据库连接吗?
  • 我应该查看其他模块以写入 postgres 数据库吗?
4

2 回答 2

1

所以我找到的一个解决方案是创建一个新线程来生成。Django 为每个线程打开一个新连接,因此从一个新线程生成可确保您将新连接传递给新进程。

回想起来,我希望我从一开始就直接使用 psycopg2 而不是 Django。Django 非常适合 Web 前端,但对于我使用它的只是模型层的独立应用程序来说不是很好。使用 psycopg2 可以更好地控制何时关闭和打开连接。不仅仅是因为分叉问题,而且我发现 Django 并没有保持持久的 postgres 连接——我们应该在 1.6 版本中更好地控制这一点,并且应该为我的特定应用程序带来巨大的性能提升。此外,在这种类型的应用程序中,我发现 Django 故意泄漏 - 可以通过将 DEBUG 设置为 False 来修复。再说一次,我现在已经编写了应用程序 :)

于 2013-08-30T11:02:16.553 回答
0

libpq驱动psycopg2程序是 django 通常使用的驱动程序所构建的,不支持分叉活动连接。我不确定是否可能有另一个驱动程序没有,但我认为不会 - 该协议不支持在同一连接上多路复用多个会话。

解决问题的正确方法是确保每个分叉的进程都使用自己的数据库连接。最简单的方法通常是等到分叉之后再打开连接。

于 2013-08-28T19:25:38.003 回答