2011-08-19 83 views
2

我有一个支持单个客户的Spring应用程序。在Spring JPA应用程序中使用多个数据库

我想扩展此应用程序以支持多个客户,其中每个客户数据库存储在单独的数据库中。每个客户的数据库模式是相同的,并且相同的DAO和业务逻辑应该保持不变。

我如何用Spring/JPA来完成这个工作?我需要拥有多个持久化上下文,并根据当前登录的用户在适当的实体管理器工厂中连线吗?是否有任何实施类似的东西的例子?

回答

1

我建议不要在单个应用程序下运行单独的数据库。如果重新设计数据模型以合并多个客户不是一种选择,为什么不运行应用程序服务器/ Web容器的多个实例,每个客户一个?否则,你将不得不面对拥有共享平台和孤立数据库的弊端。

对于多个客户数据库和单个应用程序,您的代码将变得更加复杂,您无法保证客户数据完全隔离(例如,由于应用程序中的错误,客户显示错误的数据,所以没有在隔离每个客户方面有很大的好处),并且您将维护每个客户数据库的噩梦。另外,通过拥有不同的数据库,您几乎可以保证有人发尖的人将要求为客户A提供一些定制功能,同时保持客户B的功能不变,因为“......这很容易,因为我们有不同的数据库...“,忘记该应用程序是共享的。

0

如果你真的想为特定客户单独的数据库,这将是去—定义单独持久化单元用相同的实体定义的方式,但不同的实体管理器工厂配置。

对我来说,这听起来更像是需要重新设计数据库结构。我猜测应用程序只是为了一个客户而编写的,而且事实证明,更多的应用程序出现在了地平线上,所以,嘿,让我们做点什么,快点!你是不是想复制粘贴,但在更大的规模?如果你想拥有一些具有相同结构的数据库,你将会拥有很多的JPA冗余:例如,映射文件中定义的所有东西(查询,实体关系映射等)都是根据持久性单位—你必须重复这些定义并保持它们全部同步。

我会停在这里,因为它只是猜测,缺乏更广泛的描述。

相关问题