从Java手动使用@Transactional方法创建Spring @Service实例
作者:互联网
假设有@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和Java代码中指定的jdbcUrl创建具有自动连接的OrderDao的OrderService的独立工作实例,如下所示:
final int tenantId = 3578;
final String jdbcUrl = "jdbc:mysql://localhost:3306/database_" + tenantId;
OrderService orderService = someMethodWithSpringMagic(appContext, jdbcUrl);
如您所见,我想向现有的基于Spring的应用程序引入多租户架构,其中每个数据库的租户策略.
请注意,在使用自我实现的类似jdbcTemplate的逻辑以及JDBC事务正确运行之前,我能够非常轻松地实现这一目标,因此这是非常有效的任务.
还请注意,我需要非常简单的事务逻辑来启动事务,在该事务范围内的服务方法中执行多个请求,然后在发生异常时提交/回滚.
Web上有关Spring多租户的大多数解决方案都建议使用基于注释的配置在xml config AND / OR中指定具体的持久性单元,这是非常不灵活的,因为要添加新的数据库url,应停止整个应用程序,而xml config / annotation代码应该更改并启动应用程序.
因此,基本上,我正在寻找一段能够创建@Service的代码,就像Spring在从XML配置/注解中读取属性之后在内部创建@Service一样.我也正在考虑使用ProxyBeanFactory,因为Spring使用AOP创建服务实例(因此,我想简单的旧的可重用OOP并不是这里的方法).
Spring是否足够灵活以允许这种相对简单的代码重用情况?
任何提示将不胜感激,如果我找到这个问题的完整答案,我会在这里张贴给后代:)
解决方法:
HIbernate有out of the box support for multi tenancy,请在尝试自己的方法之前先进行检查. Hibernate要求提供MultiTenantConnectionProvider
和CurrentTenantIdentifierResolver
的默认实现,但是您始终可以编写自己的实现.如果仅是模式更改,则实际上非常容易实现(在返回连接之前执行查询).否则,持有数据源地图并从中获取一个实例,或创建一个新实例.
大约8年前,我们已经编写了一个通用解决方案,文档记录为here,代码为here.它不是专门用于休眠的,基本上可以与任何需要切换的东西一起使用.我们将其用于数据源以及一些与Web相关的事物(包括主题).
标签:spring-aop,transactions,aop,spring,java 来源: https://codeday.me/bug/20191028/1951848.html