有沒有辦法通過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爲此做出的解決方案,或者如果我應該寫我自己的過濾器...我不想重新發明輪子,如果我不必;-) –