通过Spring和Hibernate管理多个动态创建的数据库的最佳实践是什么?
假设当客户订阅服务时,您必须为每个客户动态创建一个数据库,所有数据库都基于相同的模式 当客户通过身份验证(一个主数据库管理所有客户详细信息)时,将使用其唯一的用户名访问相应的数据库并检索所需的信息 问题1:以上是解决此类问题的好方法还是有更好的解决方案 问题2:如果没有更好的解决方案,如何使用Spring和Hibernate实现这一点通过Spring和Hibernate管理多个动态创建的数据库的最佳实践是什么?,hibernate,spring,multiple-databases,Hibernate,Spring,Multiple Databases,假设当客户订阅服务时,您必须为每个客户动态创建一个数据库,所有数据库都基于相同的模式 当客户通过身份验证(一个主数据库管理所有客户详细信息)时,将使用其唯一的用户名访问相应的数据库并检索所需的信息 问题1:以上是解决此类问题的好方法还是有更好的解决方案 问题2:如果没有更好的解决方案,如何使用Spring和Hibernate实现这一点 编辑:我需要知道的是,如何在客户订阅时实现数据源创建,而无需编辑Spring配置文件。它需要自动化。问题1:有多种选择。关于这些选项以及每个选项的优缺点 问题2:
编辑:我需要知道的是,如何在客户订阅时实现数据源创建,而无需编辑Spring配置文件。它需要自动化。问题1:有多种选择。关于这些选项以及每个选项的优缺点 问题2:
我与这个问题斗争了很长一段时间,我设法解决了它!这样,如果为客户机添加了一个新的数据库,则可以通过软件立即访问数据库,因为每个客户机都有一个专用的数据库,并且模式设计是相同的 在运行时修改数据源以连接到所需的数据库。通常我们的约定是用户的帐户名是数据库名,例如 以下是分项数字: Applicationcontext.xml
<bean id="dataSource" class="com.package.util.TenantRouter">
<property name="targetDataSources">
<map>
<entry key="db" value-ref="db"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="parentDataSource"/>
</bean>
<bean id="parentDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:6432/db?autoReconnect=true"/>
<property name="username" value="DBUSER"/>
<property name="password" value="DBPASS"/>
</bean>
<bean id="db" parent="parentDataSource">
<property name="url" value="jdbc:postgresql://localhost:5432/db?autoReconnect=true"/>
<property name="username" value="DBUSER"/>
<property name="password" value="DBPASS"/>
</bean>
UserContextUtil.getUserContext().getTenant().toString()
返回客户端URL中提供的要连接到的请求Db
我希望这能帮助那些头痛的人
干杯 谢谢您的输入,但是我看不出spring示例有什么帮助,每个服务的bean都是用XML硬编码的。如果动态添加了另一个客户,则需要修改XML,对吗?我想知道如何处理动态添加客户的情况(不仅仅是预定义的)。@Adnan Doric-这就是为什么我提到你需要从那里开始,如果需要,定制提供的实现我不知道如何开始实现,这就是为什么我首先问这个问题。我可以看到很多在运行时交换数据源的实现,但是没有在运行时动态创建数据源。请阅读下面我的评论,我是如何成功地使用Postgres数据库设置动态切换的。你真的创建并使用了动态创建的dbs吗?@Adnan Doric你能看到这个问题并帮助我创建样板文件或任何git吗公开回购?你能检查这个问题并相应地指导我吗@Simon Mbatia
@Override
protected Object determineCurrentLookupKey() {
String tenant="defaultdb";
if (UserContextUtil.getUserContext()!=null){
tenant = UserContextUtil.getUserContext().getTenant().toString();
}
return tenant;
}
@Override
protected DataSource determineTargetDataSource() {
//current DB
String db_name = (String) determineCurrentLookupKey();
//System.out.println("THIS DB:"+db_name);
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("org.postgresql.Driver");
String url="jdbc:postgresql://localhost:5432/"+db_name+"?autoReconnect=true";
//System.out.println("URL:"+url);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}