有没有办法通过SpringMVC设置MyBatis来为整个http请求创建一个事务?通常在MyBatis中有类似Hibernate OpenSessionInViewFilter
的东西,还是应该编写自己的过滤器来实现这种行为?使用MyBatis和Spring处理请求范围
2
A
回答
4
你被概念 “会话” 和 “交易” 相混淆。 OSIV打开会话,在一个会话中可能会有多个事务共存。通常,您应该将@Transactional
属性应用于控制器使用的服务,具体取决于您的业务需求。
此外,一切的一大交易是反模式。理想情况是为用户的操作拥有读写事务,然后另一个只读事务是为用户构建响应。它节省了资源,因为用于插入/更新的数据库锁定会在早些时候发布。
1
您可以让Spring处理您的交易。
看看文档。我很容易。 您只需要在需要它的方法中配置和添加@Transactional注释。
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html
0
我的建议是阅读了以下帮助文档: http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/transaction.html
既然你没有弹簧MVC框架的每个部分的完全控制我建议使用在基础班春的AOP切入点-mvc启动事务(每个请求都执行该方法)。您可以在10.5.2节中找到这种方法。 只要确保你的切入点的类是由spring otherwize初始化的就行不通了。
0
如果您确实需要将单个交易绑定到特定请求,则可以考虑在您的Filter
中使用TransactionTemplate
。我不认为你可以在Filter
使用@Transactional
,除非如果它是由弹簧(如管理:的FilterChain
就像Spring Security的过滤器部分
这里是你可以用TransactionTemplate
public class TransactionalFilter implements Filter {
private TransactionTemplate transactionTemplate;
public void destroy() {
}
public void doFilter(final ServletRequest req, final ServletResponse resp, final FilterChain chain) throws ServletException, IOException {
transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus status) {
try {
chain.doFilter(req, resp);
} catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
return null;
}
});
}
public void init(FilterConfig config) throws ServletException {
transactionTemplate = new TransactionTemplate(WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()).getBean(PlatformTransactionManager.class));
}
}
相关问题
- 1. Spring Rest Web请求范围
- 2. 用spring处理ajax请求
- 3. 使用Spring MVC处理请求
- 4. 使用cURL处理字节范围请求
- 5. 定义Spring请求范围bean
- 6. 使用Spring MVC处理JSON和表单数据请求
- 7. Ninject - 请求范围已被处置
- 8. 请求处理完成后,可以访问范围为“请求”的对象吗?
- 9. 如何处理Spring.NET中的空请求范围对象
- 10. 在请求中处理Window.open在jsf中的范围
- 11. 使某个类型的所有Spring bean的请求范围为
- 12. Spring MVC请求正文错误处理
- 13. Spring MVC请求处理失败
- 14. Spring MVC-异步请求处理
- 15. 使用servlet处理多部分请求和正常请求
- 16. 在Primefaces JSF2.x中使用请求范围管理bean
- 17. 库处理范围
- 18. 弹簧事件和范围请求
- 19. Ninject请求范围和回调
- 20. Ninject和连接请求范围
- 21. iBATIS的 - 请求和会话范围
- 22. Ninject请求范围和衍生线程
- 23. jsf 2.0 spring 3范围请求不起作用
- 24. 如何检查Spring中的请求范围可用性?
- 25. Python:多处理和请求
- 26. JSF请求范围形式
- 27. 范围请求cxf jaxrs
- 28. JSF中的请求范围
- 29. OAuth2请求其他范围
- 30. 弹簧请求范围bean
是的,它是做什么真的,但我的问题是,如果有可能使用MyBatis来处理整个请求,例如带有Hibernate的'org.springframework.orm.hibernate3.support.OpenSessionInViewFilter',它将会话绑定到整个请求处理的线程。你根本不需要添加@Transactional注解 –
你可以创建一个Spring托管的servlet过滤器,并且注释用@Transactional做doFilter方法。 – Mikhas
当然,这是我的答案,如果有MyBatis为此做出的解决方案,或者如果我应该写我自己的过滤器...我不想重新发明轮子,如果我不必;-) –