【问题标题】:create and switch database dynamically via hibernate通过hibernate动态创建和切换数据库
【发布时间】:2016-01-25 13:05:43
【问题描述】:

请考虑这样的场景:
(1)有一个全局数据库A,包括两个表:Users,Configs。
(2)表Users有三列:UserId,UserName,UserPass。
(3)Table Configs有六列:Id,UserId,Host,Port,DBUser,DBPass。
(4)还有另一个数据库user_A,包含很多表。
当user_A登录时,应用程序会通过数据库中的Users表检查用户的密码,然后从数据库A的Configs表中获取user_A的数据库连接字符串。其余操作均基于数据库User_A。
另外,当用户登录时,没有对应的数据库,应用程序要先创建对应的数据库。

如何实现?我使用的是struts2+spring+hibernate。
非常感谢您的回答:)

【问题讨论】:

  • 你可以试试hibernate session factory。
  • 我在 applicationContext.xml 中使用休眠会话工厂,但是数据源在 xml 中是硬编码的,当然我可以在 xml 文件中硬编码多个数据源。但是如何在内存中动态创建数据源使用存储在数据库 A 中的连接字符串?
  • 两个不同的 SessionFactories 怎么样?
  • 每个用户都有一个数据库,这需要很多SessionFactories吗? :(
  • 我想说,与每个用户拥有一个数据库相比,每个用户拥有一个 SessionFactory 的开销可以忽略不计。

标签: java mysql database hibernate spring-mvc


【解决方案1】:

我们在系统中使用了多个数据源,但是它们被硬编码在 XML 文件中。据我所知,我们的方法与此类似:

http://forum.spring.io/forum/spring-projects/data/93914-dynamic-datasources-at-runtime

我也找到了这个例子。也许对你有帮助。

http://www.jvmhost.com/articles/create-drop-databases-dynamically-java-jsp-code

【讨论】:

  • 非常感谢!您的第一个链接对我很有帮助!但是如果我动态创建数据源,是否可以同时使用两个连接池?在上面的链接中,连接池是没有提到。
  • 我很高兴该链接很有用。您的意思是同时使用动态数据源吗?
  • 是的,是的!许多用户将连接到同一个动态数据源,他们可以共享一个连接池吗?
  • 据我了解,每个 DataSource 都会创建自己的 ConnectionPool。您可以在创建 DataSource 期间对其进行配置。
【解决方案2】:

在构建SessionFactory 时,该数据库需要存在。为每个用户创建一个数据库是一个非常奇怪的要求。

您可以拥有一个数据库和多个用户帐户,并且使用角色和权限可以限制用户的访问。

您可以使用 Hibernate ConnectionProvider 来控制数据库连接,但动态创建数据库需要访问操作系统外壳。

【讨论】:

  • 感谢您的回答:) 我只是举个例子,每个用户都有一个数据库。事实上,我们的应用程序会处理很多合作伙伴的项目数据。每个项目的数据都将存储在自己的数据库中。
猜你喜欢
  • 2014-06-23
  • 2014-01-30
  • 2019-04-02
  • 2012-04-12
  • 2011-06-23
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多