Я столкнулся с проблемой, когда помещал в метод аннотацию @ Transactional .За некоторое время до запуска метода он запустился с задержкой на 15 минут (928787 миллисекунд в моем журнале), а затем завершил выполнение за несколько миллисекунд.
Это не всегда воспроизводится.Я обнаружил эту проблему 1 в 100000 выполнений метода.
Кажется, что-то пошло не так в прокси, когда TaskDispatcher пытается вызвать метод save ().
TaskDispatcher.java
public class TaskDispatcher extends Thread {
private DBProcessor dbProcessor;
private ThreadPoolTaskExecutor myTaskExecutor;
...
@Override
public void run() {
this.myTaskExecutor.execute(new Runnable() {
@Override
public void run() {
dbProcessor.processData(data);
}
});
}
}
DBProcessor.java
public class DBProcessor extends ADataProcessor {
private DBService dbService;
...
@Override
public boolean processData(Data data) throws DataProcessorException {
long startTime = System.currentTimeMillis();
success = dbService.save(tradeReportID, translatedMessages, result);
logger.info("processing time : {} ms.", tradeReportID, action, (System.currentTimeMillis() - startTime));
return success;
}
}
DBServiceImpl.java
public class DBServiceImpl extends CustomRepository implements DBService {
...
@Transactional
public boolean save(String tradeOrderId, List<TranslatedMessage> translatedMessages, DBDealServiceResult result) throws DealProcessorException, DealProcessorExceptionNoRollback {
logger.info("start DB processing");
... // do some db operation
logger.info("finished DB processing");
return success;
}
}
пружина.xml
...
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="connectionPoolDataSource" />
<property name="packagesToScan" value="com.mycompany.myapp.jpa.entity" />
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.generate_statistics" value="${hibernate.generate_statistics}"/>
<entry key="hibernate.format_sql" value="${hibernate.format_sql}"/>
</map>
</property>
</bean>
<bean id="hibernateJpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.Oracle12cDialect" />
</bean>
Журналы показывают время выполнения
2018/05/17 01:58:36.903|INFO |[myTaskExecutor-4] c.m.m.a.d.DBServiceImpl start DB processing
2018/05/17 01:58:36.915|INFO |[myTaskExecutor-4] c.m.m.a.p.DBServiceImpl finished DB processing
2018/05/17 01:58:36.920|INFO |[myTaskExecutor-4] c.m.m.a.d.DBProcessor processing time : 17 ms.
2018/05/17 01:58:36.931|INFO |[myTaskExecutor-16] c.m.m.a.d.DBServiceImpl start DB processing
2018/05/17 01:58:37.745|INFO |[myTaskExecutor-16] c.m.m.a.p.DBServiceImpl finished DB processing
2018/05/17 01:58:37.745|INFO |[myTaskExecutor-16] c.m.m.a.d.DBProcessor processing time : 928787 ms.
Сведения о версии:
spring-framework : 5.0.5.RELEASE
spring-tx : 5.0.5.RELEASE
spring-jdbc : 5.0.5.RELEASE
spring-orm : 5.0.5.RELEASE
hibernate-jpa-2.1-api : 1.0.0.Final
hibernate-core : 5.2.7.Final
tomcat-jdbc : 7.0.70
oracle driver : ojdbc7 12.1.0.2