我有多个基于客户ID分片的MySQL数据库。有一个微服务提供有关分片信息的详细信息(哪个客户ID属于哪个数据库等)。
到目前为止,我的代码使用单个数据源,我有一个函数,它提供sessionFactory作为hibernate配置文件的一部分:
@Bean
public LocalSessionFactoryBean sessionFactory() {
// set data source here
}
数据源由以下方式返回:
@Bean
public DataSource dataSource() {
}
我在DAO中自动连接sessionFactory:
@Autowired
private SessionFactory sessionFactory;
现在,有了多个数据源,我需要:
我不知道如何自动装配sessionFactory,以便根据客户ID初始化数据源。
非常感谢任何帮助。
答案 0 :(得分:0)
羞耻我之前没有看到这个问题。使用hibernate 4+执行此操作的最简单方法是将分片设置为数据源。我个人使用容器管理的数据源,但你可能会采用另一种方式,以艰难的方式设置和维护自己的连接池。然后,这些数据源具有与之关联的jndi名称,允许您从hibernate连接提供程序访问连接池。如果以这种方式完成,你将只能为每个事务只写一个分片,当然你只能写一个分片只能写入多个数据源。注意将所有关联的关系数据放在同一模式中的同一个分片上。这一点很重要。您可以利用App服务器事务注册表连接跨缓存提供程序和所有数据源的JTA事务访问。请记住在每个事务中除了一个数据源之外的所有数据源都使用XA。利用hibernate多租户为使用哪种架构提供方向。 (还通过threadlocal传递到连接提供程序并分配给该数据源的连接)。您将需要密切关注equals和hash方法,因为逻辑上希望相等的多个对象可以同时附加到不同的类加载器,并且默认情况下实际上不相等。当发生这样的事件时,当这些对象包含在事务中并且尝试持久化它们时,您将收到一些非常奇怪的休眠错误消息。覆盖一切。