如何防止在tomcat启动时初始化的类对数据库进行双重写入?

时间:2017-10-05 08:57:00

标签: java servletcontextlistener

我似乎已经在这里陷入了困境。

我在tomcat启动时加载一个单例类(在web.xml中使用load-on-startup),并从数据库加载值。加载后,将一组数据写入同一数据库但在不同的表中。问题是,数据加载完美,但写入发生了两次。我知道写入发生了两次,因为我有2个webapp实例。

但是,需要2个相同webapp的实例。我也无法更改文件夹结构。无法在server.xml中进行更改,因为它是自动生成的。 (请不要暗示这些,不能这样做!)

我尝试使用servletcontextlistener来初始化单例类,但我使用的数据库框架当时没有加载,我在查询结果中得到空指针异常。因此,单例类不会从数据库中加载值。

我正在使用eclipse。

我该怎么做(如果可能的话)?

我正在寻找servletcontextlistener是否可以通过预先加载db框架来完成这项工作。任何解决方案?

1 个答案:

答案 0 :(得分:1)

对此的解决方案是创建自己的"数据库锁定"即,当任何webapp实例出现时,让它检查一个表 - 让我们称之为"锁定"如果它不存在于DB中,那么让它创建它并进行插入。如果您的webapp的下一个实例启动,那么如果它发现已经锁定了,那么它可以等待锁定被释放或者只是跳过init。

如果您的其他Web应用程序在您的第一个webapp完成它的工作后必须自己进行升级,那么创建一个维护数据库升级状态的表。每个webapp一旦在初始化期间完成工作,就会更新该表。