Spring - Hibernate - 动态配置多个数据库

时间:2017-07-31 11:06:07

标签: mysql spring hibernate sharding sessionfactory

我有多个基于客户ID分片的MySQL数据库。有一个微服务提供有关分片信息的详细信息(哪个客户ID属于哪个数据库等)。

到目前为止,我的代码使用单个数据源,我有一个函数,它提供sessionFactory作为hibernate配置文件的一部分:

@Bean
public LocalSessionFactoryBean sessionFactory() {
  // set data source here
}

数据源由以下方式返回:

@Bean
public DataSource dataSource() {
}

我在DAO中自动连接sessionFactory:

@Autowired
private SessionFactory sessionFactory;

现在,有了多个数据源,我需要:

  • 从microservice读取已配置的数据库
  • 使用db列表动态创建数据源
  • sessionFactory应根据客户ID动态创建。

我不知道如何自动装配sessionFactory,以便根据客户ID初始化数据源。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

羞耻我之前没有看到这个问题。使用hibernate 4+执行此操作的最简单方法是将分片设置为数据源。我个人使用容器管理的数据源,但你可能会采用另一种方式,以艰难的方式设置和维护自己的连接池。然后,这些数据源具有与之关联的jndi名称,允许您从hibernate连接提供程序访问连接池。如果以这种方式完成,你将只能为每个事务只写一个分片,当然你只能写一个分片只能写入多个数据源。注意将所有关联的关系数据放在同一模式中的同一个分片上。这一点很重要。您可以利用App服务器事务注册表连接跨缓存提供程序和所有数据源的JTA事务访问。请记住在每个事务中除了一个数据源之外的所有数据源都使用XA。利用hibernate多租户为使用哪种架构提供方向。 (还通过threadlocal传递到连接提供程序并分配给该数据源的连接)。您将需要密切关注equals和hash方法,因为逻辑上希望相等的多个对象可以同时附加到不同的类加载器,并且默认情况下实际上不相等。当发生这样的事件时,当这些对象包含在事务中并且尝试持久化它们时,您将收到一些非常奇怪的休眠错误消息。覆盖一切。