每个线程一个 DAO 还是线程安全 DAO?
Posted
技术标签:
【中文标题】每个线程一个 DAO 还是线程安全 DAO?【英文标题】:One DAO per thread or threadsafe DAO? 【发布时间】:2011-01-01 08:18:00 【问题描述】:我想知道在多线程应用程序中是否存在经过批准的做法。我应该每个线程有一个 DAO 还是简单地将一个 DAO 设为线程安全的单例。
【问题讨论】:
【参考方案1】:这在很大程度上取决于您用于数据访问的机制。如果您有一个非常可扩展的数据访问,并且有很多线程,那么使用某种形式的线程静态数据访问可能是有利的。
如果您没有可扩展的数据访问,您的提供程序不支持每个进程的多个线程,或者您此时不需要可扩展性,则使用具有适当同步的单例更简单且更易于实现。
对于大多数业务风格的应用程序,我个人认为单例方法更容易维护,而且可能更好——如果没有其他原因的话,它更容易有效地测试。可能不需要多个线程进行数据访问,因为数据访问可能不会成为影响可用性的瓶颈(如果您设计正确,并且适当地批量请求)。
【讨论】:
我的 DAO 实际上连接到两个源:SimpleDB 和通过 RPC 的 php API。我的猜测是我可能应该在每个线程中使用大约 100 个线程的 DAO,以避免出现瓶颈问题。在这种情况下,您有什么明显的理由不这样做吗? 让 DAO 成为单例可能更好,并且在内部,只是异步工作。然后它可以根据需要使用 ThreadPool 进行扩展...这对于 PHP API 尤其如此,因为 Web 请求可以很好地异步工作,并且大多数 Web 框架对此都有很好的支持...【参考方案2】:使用最适合您的应用程序架构的方法,除非:
1) 创建数据访问对象的成本很高,在这种情况下,您应该倾向于线程安全的单例。
2) 您的对象保持可变状态,如Active Record pattern。 (不可变的 DAO 配置状态,如超时阈值,不算在内。)
【讨论】:
以上是关于每个线程一个 DAO 还是线程安全 DAO?的主要内容,如果未能解决你的问题,请参考以下文章
mybatis项目,在线程中调用Service和DAO层的方法时会报空指针