代码之家  ›  专栏  ›  技术社区  ›  Ariod

从多个线程读取相同的结果集

  •  1
  • Ariod  · 技术社区  · 15 年前

    在数据库中,我有一个定义表,在启动时从应用程序中读取一次。这个定义表很少更改,所以读取它一次并在每次更改时重新启动应用程序是有意义的。

    但是,在读取表(放入结果集中)之后,多个处理程序将在自己的线程中读取该表。

    你建议如何完成这项工作?

    我的想法是填充一个cachedrowset,然后在每次新请求出现时为每个处理程序创建该集合的副本(通过createCopy()方法)。

    你认为这是明智的吗?这能提供良好的性能吗?

    谢谢。

    3 回复  |  直到 13 年前
        1
  •  0
  •   bluish dmajkic    13 年前

    我认为将配置表读入静态数据结构是一种模式。( ConcurrentHashMap )然后让线程查找它。

    通过从一个 Servlet.init() -它保证每个servlet执行一次。

        2
  •  1
  •   John Kane    15 年前

    使用单例模式可能更好。这将允许您创建一个类,所有线程都可以访问该类来获取所需的对象。这还允许您在进行更改时不必关闭应用程序。实现这一点的一种方法是创建一个类,在该类中,您可以获取和设置所需信息的方法。以及另一个将给出该对象引用的类。

    给出引用的类可以有一个私有的构造函数和一个GetInstance方法,该方法将返回对自身的引用,以确保只有一个引用存在。这也会给你一些其他的选择,当事情发生变化时,你可以做什么。

        3
  •  1
  •   The Code Pimp    15 年前

    好的,如果您控制对结果集的访问,并且在重新启动应用程序之前不关心更新结果集,那么我建议将cachedrowset包装在自定义类中。实现这一点的一种可能的方法是拥有一个包装类,它是一个单独的类,并为它提供getter方法,这样其他线程或类就可以访问它。这样您就不需要制作副本,也不需要依赖于cachedrowset实现。创建副本会导致不必要的开销。想象一下,按照上面描述的方式,如果有1000个线程访问结果集,那么您将调用createCopy()1000次,从而创建同一结果集的1000个副本。