【问题标题】:Session management with sqlalchemy and pyro使用 sqlalchemy 和 pyro 进行会话管理
【发布时间】:2012-12-29 08:44:29
【问题描述】:

我实际上是在将 SQLAlchemy 与 MySQL 和 Pyro 一起使用来制作服务器程序。许多客户端连接到此服务器以发出请求。程序只提供 MySQL 数据库中的信息,有时还会进行一些计算。

是为每个客户端创建一个会话还是为每个客户端使用相同的会话更好?

【问题讨论】:

  • 辛蔡会南!您能否向我们提供更多详细信息,如果没有其他信息(例如服务器的使用情况),将无法给您答案。
  • 你好,xin chao,更详细的程序只提供数据库 MySQL 的信息,有时会进行一些计算
  • 主要问题是客户端是否需要保持单独的状态?或者他们可以共享状态变量吗?他们需要保持状态吗?您提到有计算,客户可以共享计算吗?您需要研究状态将维持什么,然后问自己他们可以分享吗?
  • 客户端之间没有共享状态,它们是独立的。但问题是我不需要为每个客户端创建新会话,因为一次会话就足够了。
  • 您不应该在客户端之间共享会话,因为您会共享事务状态(您永远不应该这样做)。 AFAIR Pyro 每个连接都使用一个线程,所以 scoped_session 正是您所需要的:docs.sqlalchemy.org/en/latest/orm/…

标签: mysql session sqlalchemy pyro


【解决方案1】:

你想要的是scoped_session

好处是(与客户端之间的单个共享会话相比):

  • 无需锁定
  • 支持的交易
  • 到数据库的连接池(由 SQLAlchemy 隐式完成)

如何使用

您只需创建scoped_session

Session = scoped_session(some_factory)

并在您的 Pyro 方法中访问它:

class MyPyroObject():
    def remote_method(self):
         Session.query(MyModel).filter...

幕后花絮

上面的代码保证了 Session 是根据需要创建和关闭的。会话对象在您第一次在线程中访问时立即创建,并将在线程完成后删除/关闭 (ref)。由于每个 Pyro 客户端连接在默认设置下都有自己的线程(不要更改它!),每个客户端将有一个会话。

【讨论】:

  • 感谢您的回答。在您的 remote_method 中,如果我从查询中获取一个对象,然后我想访问该对象的需要对数据库请求的成员(延迟加载)。我想这样做我需要将此对象附加到会话,对吗?在这种情况下你怎么能做到这一点?例如创建一个新的 Session 并将这个对象合并到会话中?
  • 您已经有一个会话,您将获得附加到该会话的对象。无事可做:)
  • 你可以在远程方法中做session = Session()来获取实际的会话对象,但是doesn't make any difference
  • 好的,那么session = Session() 是一个对象,但是你一开始创建的Session其实是一个类。这有点令人困惑。所以要明确一点,我将在服务器启动时创建 Session = scoped_session...,并为客户端的每个请求(和连接)一次又一次地使用 Session?
  • 没错。如果您阅读了Implicit Method Access(已经在我的其他评论中链接,您可能已经错过了),那么它不应该再令人困惑了:)
【解决方案2】:

我能尝试的最好的方法是在每个客户的请求中创建新的会话。我希望表演不会受到惩罚。

【讨论】:

  • 同样,scoped_session 正是您想要的。而且它应该比共享全局会话更快,因为在后一种情况下,您必须保证会话的非并发访问,这意味着将其锁定以供其他线程/客户端使用。
  • 但是为每个请求创建新会话呢?是否存在性能问题?
  • 取决于您如何在 Pyro 上下文中定义“请求”(我假设是远程方法调用)以及每个连接有多少。但是,如果每个连接有多个请求,可能会更糟。问题是为什么您希望每个请求而不是每个连接都有一个会话?
  • 因为会话是服务器所有的,所以我只需要一个连接:服务器连接
  • 如果您仍然对此深信不疑,那么您并不了解多线程和数据库编程的基础知识和含义。实际上,您不想在多个连接之间共享会话,因为这需要锁定(性能损失)并且您将无法正确使用事务。
猜你喜欢
  • 2016-02-07
  • 2012-12-15
  • 2013-12-18
  • 1970-01-01
  • 2016-04-26
  • 2014-09-21
  • 2017-01-23
  • 1970-01-01
相关资源
最近更新 更多