在我的一个项目中,我有一个管理多个客户机(或者客户机,如果您愿意的话)。对于它们中的每一个,我在数据库上都有一个专用的模式。但是,应用程序一次只能处理一个客户机,即用户必须在应用程序中从一个客户机切换到另一个客户机(在运行时,不重新启动应用程序),才能从这个新客户机访问数据。
您将如何管理此类项目的连接以及持久层?
我想用hibernate。在处理多个数据库/模式时,我必须非常小心的要点是什么?
斯普林在这种情况下有什么帮助吗?
如果我不够清楚,让我举例说明情况。假设我的应用程序可以处理两个客户端: clientONE
以及 clientTWO
. 我已经实现了一个类,它可以为给定的客户机提供数据库模式、用户、密码和连接字符串。
每个客户机都有一个债务人列表,但不幸的是,每个客户机的债务人表结构不同 clientONE
以及 clientTWO
. 甚至表/列的名称也不相同。。。
因此,我可以为每个客户机创建一个债务人类(我使用hibernate注解):
@Entity
@Table(name = "T_DEBTOR_ONE")
...
public class ClientOneDebtor {
@Id
@Column(name = "ID_DEBTOR")
private String idDebtor;
...
}
以及:
@Entity
@Table(name = "T_DEBTOR_TWO") // Table names are not the same among the different schemas...
...
public class ClientTwoDebtor {
@Id
@Column(name = "DEBTOR_ID") // It's just to show that the same information is stored in a column that has not the same name.
private String idDebtor;
...
}
理想情况下,我会尽量有一个共同的 Debtor
类(这里是一个抽象类,但我可以使用接口):
public abstract class AbstractDebtor {
public abstract String getIdDebtor();
...
}
@Entity
@Table(name = "T_DEBTOR_ONE")
...
public class ClientOneDebtor extends AbstractDebtor {
@Id
@Column(name = "ID_DEBTOR")
private String idDebtor;
...
}
@Entity
@Table(name = "T_DEBTOR_TWO")
...
public class ClientTwoDebtor extends AbstractDebtor {
@Id
@Column(name = "DEBTOR_ID") // It's just to show that the same information is stored in a column that has not the same name.
private String idDebtor;
...
}
这样,我就可以更容易地操作dao/服务层中的债务人对象,因为我不需要为每个客户机复制dao和服务。例如,从dao获取所有债务人列表的方法 public List<AbstractDebtor> getAllDebtors() { ... }
.
那么,当我更改应用程序管理的客户机时,如何更改上下文?换句话说,我将如何向hibernate(或spring?)表明我要使用正确的持久性对象( ClientOneDebtor
或者 ClientTwoDebtor
)关于当前由我的应用程序管理的客户端?
如果你认为我走错了方向,请毫不犹豫地分享你对如何解决这类问题的想法。。。
编辑第一个答案:
我需要处理的不同模式的数量大约是15-20个。除此之外,我只需要Map它们表的一小部分。
我还知道,为每个客户机/客户提供一个模式并不是存储数据的最佳解决方案。然而,这种架构已经存在了5年,我们可能在下一年只会使用一种架构(在最好的情况下;)。
2条答案
按热度按时间qrjkbowd1#
不幸的是,现实世界通常需要多个数据库/模式,尤其是当您有一个供应商产品的数据库必须与您的公司数据库不同时。
创建任意数量的数据库将是一团糟,为此,您确实应该考虑一种更好的数据组织形式。但是对于一组固定的(希望很小)数据库,只需在持久性配置中为它们定义一个单独的persistenceunit(这意味着一个单独的entitymanager)。
使用图示的继承方案,您可以为每个派生类分配适当的entitymanager,假设框架允许您这样做。
zzwlnbp82#
如果每次只需要一个,那就简单多了。只需创建一个
SessionFactory
每个数据库。避开HibernateUtils
静态SessionFactory
示例的方法,你不会有任何问题。如果没有太多的数据库(数百个),那么使用spring的一个好方法是示例化一个单独的spring
ApplicationContext
对于每个包含SessionFactoryBean
以及DataSource
数据库的特殊配置。可以使用Spring机构,如
PropertyOverrideConfigurer
和一个普通的父母ApplicationContext
把所有常见的东西都算出来,这样你的孩子就多了ApplicationContext
它们体积小,易于维护。当一个请求进来时,只需选择
ApplicationContext
你想和他一起工作,开始从中吸取教训。如果不想使用spring,还可以创建多个
SessionFactory
示例并将“当前”示例存储在静态ThreadLocal
.