假设有以下类似的@Service
和@Repository
接口:
@Repository
public interface OrderDao extends JpaRepository<Order, Integer> {
}
public interface OrderService {
void saveOrder(Order order);
}
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Override
@Transactional
public void saveOrder(Order order) {
orderDao.save(order);
}
}
这是一个可用的应用程序部分,一切都被配置为访问单个数据库,而且一切都运行良好。
现在,我希望有可能使用纯Java创建一个具有自动装配OrderDao的独立工作实例的OrderService,并在Java代码中指定jdbcUrl,就像这样:
final int tenantId = 3578;
final String jdbcUrl = "jdbc:mysql://localhost:3306/database_" + tenantId;
OrderService orderService = someMethodWithSpringMagic(appContext, jdbcUrl);
如您所见,我想在现有基于Spring的应用程序中引入“多租户架构”和“每个数据库一个租户”的策略。请注意,我以前使用类似jdbcTemplate的自实现逻辑和正确工作的JDBC事务轻松实现了这一点,因此这是一个非常有效的任务。请注意,我需要相当简单的事务逻辑来启动事务,在该事务范围内对服务方法执行多个请求,然后在异常上提交/回滚。大多数关于Spring的多租户解决方案都建议在xml配置中指定具体的持久性单元和/或使用基于注释的配置,这非常不灵活,因为为了添加新的数据库URL,整个应用程序应该停止,xml配置/注释代码应该进行更改并重新启动应用程序。因此,基本上我正在寻找一段代码,它能够像Spring在从XML配置/注释读取属性之后内部创建服务一样创建@Service。我也在研究使用ProxyBeanFactory来实现这一点,因为Spring使用AOP来创建服务实例(因此我猜想简单的好老的可重用OOP不适用于这里)。Spring是否足够灵活以允许这种相对简单的代码复用?任何提示都将不胜感激,如果我找到了完整的解答,我会在这里发布以供将来的世代使用 :)
Hibernate
支持多租户,但不幸的是,该项目使用JpaRepository
,我希望尽可能重用现有的代码库,而不必重写它。 - Yuriy NakonechnyyHibernate
对多租户的支持,并记得在使用它时遇到了一些障碍。在我之前的评论中,我犯了一个错误,说问题出在JpaRepository
上 - 我再次查阅了文档,发现为了实现它,我需要指定MultiTenantConnectionProvider
,而其唯一的实现依赖于JNDI
,但我不太愿意使用它,因为这会增加额外的复杂性(在我的情况下是不必要的)- 请指教如果我错了。 - Yuriy NakonechnyySpring
中的TargetSource
接口非常着迷 - 它确实提供了许多灵活性,有时非常需要 :) 请将您的解决方案发布为答案,我会在测试后点赞并接受它。 - Yuriy Nakonechnyy