我配置了具有事務支持的春天。是否有任何方法可以記錄事務,以確保我正確設置所有內容?在日誌中顯示是查看正在發生的事情的好方法。在日誌中顯示春季交易
回答
在log4j.properties
(替代記錄儀,或Log4j的XML格式,檢查文檔)
根據您的事務管理器,你可以設置的日誌記錄級別春天的框架,以便它給你更多的交易信息。例如,在使用JpaTransactionManager
的情況下,您可以設置
log4j.logger.org.springframework.orm.jpa=INFO
(這是您的事務管理器的封裝),也
log4j.logger.org.springframework.transaction=INFO
如果INFO
是不夠的,使用DEBUG
因爲您可以在運行時訪問Spring類,所以您可以確定事務狀態。這篇文章可以幫助你:
斷開的鏈接.... – Gab 2017-07-19 10:08:52
非常壞,但請嘗試:[調試Spring的@Transactional註釋提示](http://blog.timmattison.com/archives/2012/04/19/tips-for-debugging-springs -transactional-annotation /)(還沒有嘗試過)。它使用[TransactionSynchronizationManager](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html)獲取交易狀態。代碼可能應該使用線程局部變量來緩存對「isActualTransactionActive()」的引用,而不是在每個日誌記錄調用中檢索它。 – 2017-10-07 16:17:02
最有趣的日誌信息JtaTransactionManager.java
(如果這個問題仍然是關於JtaTransactionManager
)記錄在DEBUG
優先。假設你有classpath中的某處log4j.properties
,我因此建議使用:
log4j.logger.org.springframework.transaction=DEBUG
您可以啓用JDBC日誌記錄以及:
log4j.logger.org.springframework.jdbc=DEBUG
對我來說,一個好的日誌配置添加了:
log4j.logger.org.springframework.transaction.interceptor =痕量
它會告訴我日誌這樣的:
2012-08-22 18:50:00031 TRACE - 得到了[com.MyClass.myMethod]
[我自己的日誌從方法聲明事務COM .MyClass.myMethod]
2012-08-22 18:50:00142 TRACE - 完成交易,[com.MyClass.myMethod]
太棒了!不需要其他軟件包的所有信息/調試/跟蹤日誌記錄,當這是你正在尋找的東西時:D – Johanneke 2015-02-18 13:23:10
對於彈簧啓動應用:
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
以下是我在Logback Layout實現中使用的一些代碼,派生自ch.qos.logback.core.LayoutBase。
我創建了一個線程局部變量來存儲對方法org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
的引用。每當打印出一條新的日誌行時,將調用getSpringTransactionInfo()
,並返回一個將進入日誌的單字符字符串。
參考文獻:
- Tips for Debugging Spring's @Transactional Annotation
- org.springframework.transaction.support.TransactionSynchronizationManager
- java.lang.ThreadLocal
- java.lang.Class.getMethod()
代碼:
private static ThreadLocal<Method> txCheckMethod;
private static String getSpringTransactionInfo() {
if (txCheckMethod == null) {
txCheckMethod = new ThreadLocal<Method>() {
@Override public Method initialValue() {
try {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Class<?> tsmClass = contextClassLoader.loadClass("org.springframework.transaction.support.TransactionSynchronizationManager");
return tsmClass.getMethod("isActualTransactionActive", (Class<?>[])null);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
};
}
assert txCheckMethod != null;
Method m = txCheckMethod.get();
String res;
if (m == null) {
res = " "; // there is no Spring here
}
else {
Boolean isActive = null;
try {
isActive = (Boolean) m.invoke((Object)null);
if (isActive) {
res = "T"; // transaction active
}
else {
res = "~"; // transaction inactive
}
}
catch (Exception exe) {
// suppress
res = "?";
}
}
return res;
}
- 1. 春季託管交易@交易註釋
- 2. Scala的春季交易
- 3. 春季:交易不回滾
- 4. 春季交易問題
- 5. 春季 - 只讀交易
- 6. 春季交易行爲
- 7. 春季編程交易
- 8. 春天日誌服務和交易
- 9. 春季交易沒有提交
- 10. 春季交易中的一個連接?
- 11. 搞清春季日誌
- 12. 涉及春季和非春季的JTA交易
- 13. 春季交易 - 代理混淆
- 14. 春季交易JDBC和JMS的同步
- 15. 春季自我注入交易
- 16. 春季交易「必需」傳播
- 17. 春季交易:接口v類
- 18. 春季交易管理問題?
- 19. 春季交易超時不起作用
- 20. JPA春季交易和回滾
- 21. 春季交易註釋 - 執行成功
- 22. OpenSessionInView與交易? (春季/休眠/ JPA)
- 23. 春季管理交易未開始
- 24. 春季JUnit JPA交易不回滾
- 25. 遞歸調用的春季交易
- 26. 執行春季交易時出錯
- 27. 春季交易多個數據源
- 28. 春季AOP交易 - 屬性超時?
- 29. 春季交易更新實體
- 30. 多線程的AMQP春季交易
'INFO'級別根本不會顯示任何tx活動,它會太冗長。那裏需要調試。 – skaffman 2009-12-27 11:03:58
不適用於spring3.x – janwen 2012-06-11 05:42:32
@Bozho我有JpaTransactionManager,我想監視連接何時從池中借用以及何時釋放特定事務。 – Ali 2013-06-04 18:31:50