如何处理Hibernate create-drop模式,多个应用程序连接到同一个数据库?

时间:2012-05-04 21:33:44

标签: java hibernate jboss7.x

我们已经设置了开发环境,以便每次应用程序启动时Hibernate都会创建一个新的空数据库:

<property name="hibernate.hbm2ddl.auto" value="create-drop"/>

这适用于部署在服务器上的单个应用程序,但在我们的开发环境中,我们通常部署多个连接到同一数据库的应用程序。它们都使用来自应用服务器的相同数据源。

问题在于,当他们在JBoss AS7中启动时,他们并行部署,因此两个应用服务器都在尝试同时创建表。我们得到这样的东西(带有匿名表和列名):

16:07:25,307 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] (MSC service thread 1-13) Unsuccessful: create table PUBLIC.SOME_TABLE (SOME_COLUMN varchar(32) not null, SOME_OTHER_COLUMN char not null, primary key (SOME_COLUMN))
16:07:25,346 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] (MSC service thread 1-13) Table "SOME_TABLE" already exists; SQL statement:
create table PUBLIC.SOME_TABLE (SOME_COLUMN varchar(32) not null, SOME_OTHER_COLUMN char not null, primary key (SOME_COLUMN)) [42101-161]

这些错误会被忽略,服务器最终会启动,但我们想知道是否有某种方法可以避免这个问题。我们已经讨论过创建一个应用程序,该应用程序仅部署用于执行create-drop并强制其他应用程序等待,但我们不确定将JBoss的部署扫描程序更改为串行应用程序而不是并行应用程序是多么困难。我们也对其他想法持开放态度。

1 个答案:

答案 0 :(得分:0)

在开发环境中,每个部署的应用程序都应该有自己的数据库架构。这不仅可以解决问题,还可以解决以下问题:

  • 两个开发人员正在执行一些测试,其中一个失败,因为另一个已经修改了第一个使用的数据
  • 一位开发人员正在开发一种需要更改架构的演进,而另一位正在修复当前架构的错误

而且我确信还会有很多其他因素会导致问题。让每个开发人员都有自己的架构,一切都会更容易。