在数据库中,我有一个定义表,它在启动时从应用程序中读取一次。此定义表很少更改,因此读取一次并在每次更改时重新启动应用程序是有意义的。
但是,在读取表(放入 ResultSet)之后,它将被运行在各自线程中的多个处理程序读取。
你建议如何做到这一点?
我的想法是填充一个 CachedRowSet,然后在每次新请求到来时为每个处理程序创建这个集合的副本(通过 createCopy() 方法)。
你认为这是明智的吗?这是否提供了良好的性能?
谢谢。
在数据库中,我有一个定义表,它在启动时从应用程序中读取一次。此定义表很少更改,因此读取一次并在每次更改时重新启动应用程序是有意义的。
但是,在读取表(放入 ResultSet)之后,它将被运行在各自线程中的多个处理程序读取。
你建议如何做到这一点?
我的想法是填充一个 CachedRowSet,然后在每次新请求到来时为每个处理程序创建这个集合的副本(通过 createCopy() 方法)。
你认为这是明智的吗?这是否提供了良好的性能?
谢谢。
使用单例模式可能会更好。这将允许您创建一个类,您的所有线程都可以访问该类以获取他们需要的对象。这也可以让您不必在进行更改时关闭您的应用程序。实现此目的的一种方法是创建一个类,您可以在其中获取和设置所需信息的方法。另一个类将给出该对象的引用。
提供引用的类可以有一个私有构造函数和一个 getInstance 方法,该方法将返回对自身的引用以确保只有一个存在。这也将为您提供一些其他选项,了解当事情发生变化时您可以做什么。
好的,如果您控制对结果集的访问,并且在重新启动应用程序之前不关心更新结果集,那么我建议将 CachedRowSet 包装在自定义类中。一种可能的方法是拥有一个作为 singleTon 的包装类,并为其提供 getter 方法,以便其他线程或类可以访问它。这样您就无需进行复制并删除对 CachedRowSet 实现的依赖。创建副本会导致不必要的开销。想象一下,按照您上面描述的方式,如果您有 1000 个线程访问您的结果集,您将调用 createCopy() 1000 次,从而创建相同结果集的 1000 个副本。
我认为将配置表读入静态数据结构(ConcurrentHashMap
)然后让线程查找它是一种模式。
您可以通过从 a 填充参考映射来确保在启动时没有写入竞争Servlet.init()
- 它保证每个 servlet 执行一次。