Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Spring和Hibernate管理多个动态创建的数据库的最佳实践是什么?_Hibernate_Spring_Multiple Databases - Fatal编程技术网

通过Spring和Hibernate管理多个动态创建的数据库的最佳实践是什么?

通过Spring和Hibernate管理多个动态创建的数据库的最佳实践是什么?,hibernate,spring,multiple-databases,Hibernate,Spring,Multiple Databases,假设当客户订阅服务时,您必须为每个客户动态创建一个数据库,所有数据库都基于相同的模式 当客户通过身份验证(一个主数据库管理所有客户详细信息)时,将使用其唯一的用户名访问相应的数据库并检索所需的信息 问题1:以上是解决此类问题的好方法还是有更好的解决方案 问题2:如果没有更好的解决方案,如何使用Spring和Hibernate实现这一点 编辑:我需要知道的是,如何在客户订阅时实现数据源创建,而无需编辑Spring配置文件。它需要自动化。问题1:有多种选择。关于这些选项以及每个选项的优缺点 问题2:

假设当客户订阅服务时,您必须为每个客户动态创建一个数据库,所有数据库都基于相同的模式

当客户通过身份验证(一个主数据库管理所有客户详细信息)时,将使用其唯一的用户名访问相应的数据库并检索所需的信息

问题1:以上是解决此类问题的好方法还是有更好的解决方案

问题2:如果没有更好的解决方案,如何使用Spring和Hibernate实现这一点


编辑:我需要知道的是,如何在客户订阅时实现数据源创建,而无需编辑Spring配置文件。它需要自动化。

问题1:有多种选择。关于这些选项以及每个选项的优缺点

问题2:

  • 弹簧支架。也许你应该从那里开始
  • 如果让Spring为您管理数据源,您还可以动态创建数据源。您只需在运行的Spring应用程序ctx中注册com.mchange.v2.c3p0.ComboPooledDataSource或org.apache.commons.dbcp.BasicDataSource类型的bean。阅读关于如何做到这一点的文章
  • 相关的


  • 我与这个问题斗争了很长一段时间,我设法解决了它!这样,如果为客户机添加了一个新的数据库,则可以通过软件立即访问数据库,因为每个客户机都有一个专用的数据库,并且模式设计是相同的

    在运行时修改数据源以连接到所需的数据库。通常我们的约定是用户的帐户名是数据库名,例如

    以下是分项数字:

    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;
    }