我有一个应用程序,它通过TCP连接接收数据并将其写入postgres数据库。然后我使用django web前端为这些数据提供gui。由于django提供了有用的数据库访问方法,我的TCP接收器也使用django模型写入数据库。
我的问题是我需要使用分叉的TCP服务器。分叉导致子进程和父进程共享句柄。我已经读过Django不支持分叉,实际上共享数据库连接会导致问题,例如:这些例外:
DatabaseError:SSL错误:解密失败或错误记录mac
InterfaceError:连接已关闭
使分叉TCP服务器工作的最佳解决方案是什么?
答案 0 :(得分:1)
所以我找到的一个解决方案是创建一个新的线程来生成。 Django为每个线程打开一个新连接,因此从新线程生成可确保您将新连接传递给新进程。
回想起来,我希望我从头开始直接使用psycopg2而不是Django。 Django非常适合网络前端,但对于一个独立的应用来说并不是那么好,我所使用的只是模型层。使用psycopg2可以更好地控制何时关闭和打开连接。不仅仅是因为分叉问题而且我发现Django没有保持持久的postgres连接 - 我们应该在发布时更好地控制1.6,并且应该为我的特定应用程序带来巨大的性能提升。此外,在这种类型的应用程序中,我发现Django故意泄漏 - 可以通过将DEBUG设置为False来修复。然后,我现在写了应用程序:)
答案 1 :(得分:0)
libpq
驱动程序是django通常使用的psycopg2
驱动程序的基础,它不支持分配活动连接。我不确定是否有其他驱动程序没有,但我不认为 - 协议不支持在同一连接上复用多个会话。
解决问题的正确方法是确保每个分叉进程都使用自己的数据库连接。最简单的方法通常是等到打开连接直到fork之后。