如何使用Spring / Hibernate动态创建数据库并访问它们?

时间:2016-12-05 16:48:06

标签: java spring hibernate spring-mvc

我正在开发一个允许用户连接到网站的Spring / Hibernate应用程序, 创建,处理和保存自己的项目。 每个项目的名称由用户实时定义,将是服务器上的SQL数据库。 我们的想法是拥有一个“应用程序”数据库,用户的详细信息和用户与他的项目(数据库)之间的关联被存储,以及几个 “项目”数据库,由用户动态创建和更新。

所以我希望Spring在用户创建新项目时动态创建新数据库,或者在用户打开和现有项目时使用现有数据库进行地址和处理,等等。 当然,这是无法存储在xml配置文件中的内容。

目前我实现了一个带有实体管理器路由类的原型(如https://spring.io/blog/2007/01/23/dynamic-datasource-routing/中所述),我可以在servlet.context.xml中定义的两个数据源之间切换。

现在我想将其他条目添加到数据源bean中,并且可以根据用户当前正在编辑的项目在它们之间实时切换。

<bean id="dataSource" class="com.myapp.spring.config.DbConnectionRoutingDataSource">
    <property name="targetDataSources">
        <map key-type="com.myapp.spring.config.ContextType">
            <!-- ... I would like to populate and manage this dynamically ... -->
            <entry key="application" value-ref="applicationDataSource"/>
            <entry key="project" value-ref="projectDataSource"/>
        </map>
    </property>
    <property name="defaultTargetDataSource" ref="applicationDataSource" />
</bean>

我找不到关于这样做的文档,所以我有一些顾虑和问题。

1)我发现了一个名为“BeanFactoryPostProcessor”的对象:它是否适用于此目的?可以在代码中的任何时间/任何地方使用它吗?关于使用它的文档很差。

3)当数据源配置发生变化时,Spring会自动重新配置吗?我的意思是,当我添加一个新的数据源时,现有的数据源仍然有效,或者我会抛出一种“重置”?

4)这是另一种选择: 我可以动态地为项目重新配置DriverManagerDataSource(通过更改URL属性中的数据库名称)并使用相同的数据管理器,而不是添加许多数据源值吗? 使用这种方法,我只有两个数据源(“应用程序”和“项目”),但项目的数据源将更改用户实际处理的目标数据库。

<bean id="projectDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />

                               

非常感谢您的回答。

P上。

1 个答案:

答案 0 :(得分:1)

我知道这是一个非常古老的问题,但为了像我这样遇到这个问题的其他人,我想我会在这里发布我的答案。

正如Kayaman已经提到的,我认为你需要实现一个多租户应用程序。我在这里发布了一个示例示例:

https://javadeveloperzone.com/hibernate/spring-hibernate-xml-multi-tenancy-example/