从多个线程读取相同的ResultSet

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

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

您如何建议完成此任务?

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

你认为这是明智的吗? 这提供了良好的表现吗?

谢谢。

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

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

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

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

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