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