从Java手动使用@Transactional方法创建Spring @Service实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了从Java手动使用@Transactional方法创建Spring @Service实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2113字,纯文字阅读大概需要4分钟。
内容图文
![从Java手动使用@Transactional方法创建Spring @Service实例](/upload/InfoBanner/zyjiaocheng/681/b16a6a63f741494484e37a1359d88dda.jpg)
假设有@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相关的事物(包括主题).
内容总结
以上是互联网集市为您收集整理的从Java手动使用@Transactional方法创建Spring @Service实例全部内容,希望文章能够帮你解决从Java手动使用@Transactional方法创建Spring @Service实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。