使用 webpy 线程化特定数据
我正在用 webpy 编写一个小网络应用程序,我想知道是否有人有关于我遇到的小问题的任何信息。
我已经编写了一个小型 ORM 系统,它似乎运行得很好。 理想情况下,我想用 webpy 将它缝合起来,但似乎仅按原样使用它会导致线程问题(数据库连接是跨线程边界实例化/访问的,或者异常状态)。
有谁知道我如何(在 webpy 中)在与页面处理代码的其余部分相同的线程上创建数据库连接?
I'm writing a little web app with webpy, and I'm wondering if anyone has any information on a little problem I'm having.
I've written a little ORM system, and it seems to be working pretty well. Ideally I'd like to stitch it in with webpy, but it appears that just using it as is causes thread issues (DB connection is instantiated/accessed across thread boundaries, or so the exception states).
Does anyone know how I can (within the webpy) create my DB connection on the same thread as the rest of the page handling code will be?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我们将 SQLAlchemy 与 web.py 结合使用,并使用钩子来根据请求创建和关闭数据库连接。 SQLAlchemy 处理池化,因此并非每个连接都是 tcp 连接。
您要使用的线程本地存储是 web.ctx 即。 任何时候访问 web.ctx 时,您只能看到该线程设置的属性。
我们的代码如下所示:
将 Session 替换为您的数据库连接函数,它应该可以正常工作。
We use SQLAlchemy with web.py and use hooks to create and close db connections per request. SQLAlchemy handles pooling, so not every connection is a tcp connection.
The thread local storage you want to use is web.ctx ie. any time you access web.ctx you only see properties set by that thread.
Our code looks something like this:
Replace Session with your db connection function and it should work fine for you.
我会尝试一下这个。 免责声明:我没有使用 web.py 框架的经验。
我建议您尝试以下操作:
(1)创建一个全局 threading.local 实例来跟踪您的线程本地对象(在您的情况下,它将仅跟踪一个对象,即数据库会话)。
(2) 在每个请求开始时,创建一个数据库连接/会话并将其保存在 threading.local 实例中。 如果我正确理解 web.py 文档,您可以执行以下操作:
(3) 在您的控制器中方法(如果它们在 web.py 中被称为?),每当您需要数据库连接时,请使用serving.dbconnection。
I'll give this one a try. Disclaimer: I have no experience with the web.py framework.
I suggest you try the following:
(1) Create a global threading.local instance to keep track of your thread local objects (in your case, it will keep track of only one object, a database session).
(2) At the start of each request, create a db connection/session and save it in the threading.local instance. If I understand the web.py documentation correctly, you can do the following:
(3) In your controller methods (if they're called that in web.py?), whenever you need a db connection, use serving.dbconnection.