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

Spring - Hibernate - Configure multiple databases dynamically

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

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

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

数据源返回:

@Bean
public DataSource dataSource() {
}

我正在 DAO 中自动装配 sessionFactory:

@Autowired
private SessionFactory sessionFactory;

现在,对于多个数据源,我需要:

我不确定如何自动装配 sessionFactory 以使其根据客户 ID 初始化数据源。

非常感谢您的帮助。

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