Я настроил spring с поддержкой транзакций. Есть ли способ регистрировать транзакции только для того, чтобы правильно настроить все? Отображение в журнале - хороший способ увидеть, что происходит.
Отображение транзакции Spring в журнале
Ответ 1
в log4j.properties
(для альтернативных регистраторов или в формате log4j xml, проверьте документы)
В зависимости от вашего менеджера транзакций вы можете установить уровень ведения журнала в структуре spring, чтобы он дал вам больше информации о транзакциях. Например, в случае использования JpaTransactionManager
вы устанавливаете
log4j.logger.org.springframework.orm.jpa=INFO
(это пакет вашего менеджера транзакций), а также
log4j.logger.org.springframework.transaction=INFO
Если INFO
недостаточно, используйте DEBUG
Ответ 2
Для меня хорошая конфигурация регистрации для добавления:
log4j.logger.org.springframework.transaction.interceptor = trace
Он покажет мне журнал следующим образом:
2012-08-22 18: 50: 00 031 TRACE - Получение транзакции для [com.MyClass.myMethod]
[мои собственные записи журнала из метода com.MyClass.myMethod]
2012-08-22 18: 50: 00,142 TRACE - Завершение транзакции для [com.MyClass.myMethod]
Ответ 3
Наиболее интересные лог-данные JtaTransactionManager.java
(если этот вопрос по-прежнему относится к JtaTransactionManager
), регистрируются с приоритетом DEBUG
. Предположим, что у вас есть log4j.properties
где-то на пути к классам, поэтому я предлагаю использовать:
log4j.logger.org.springframework.transaction=DEBUG
Ответ 4
Поскольку вы можете получить доступ к классам Spring во время выполнения, вы можете определить статус транзакции. Эта статья может помочь вам:
Ответ 5
Вы также можете включить журналирование JDBC:
log4j.logger.org.springframework.jdbc=DEBUG
Ответ 6
Для Spring Приложения для загрузки:
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
Ответ 7
Вот код, который я использую в моей реализации Layout Layout, полученный из ch.qos.logback.core.LayoutBase.
Я создаю локальную переменную потока, чтобы сохранить ссылку на метод org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Всякий раз, когда печатается новая строка журнала, вызывается getSpringTransactionInfo()
и возвращает односимвольную строку, которая войдет в журнал.
Литература:
- Советы по отладке Spring @Аннотации к аннотации
- 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;
}