1

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

但是,在读取表(放入 ResultSet)之后,它将被运行在各自线程中的多个处理程序读取。

你建议如何做到这一点?

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

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

谢谢。

4

3 回答 3

1

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

提供引用的类可以有一个私有构造函数和一个 getInstance 方法,该方法将返回对自身的引用以确保只有一个存在。这也将为您提供一些其他选项,了解当事情发生变化时您可以做什么。

于 2010-03-27T19:25:22.760 回答
1

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

于 2010-03-27T19:49:08.273 回答
0

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

您可以通过从 a 填充参考映射来确保在启动时没有写入竞争Servlet.init()- 它保证每个 servlet 执行一次。

于 2010-03-30T19:08:43.893 回答