Задержка выполнения при использовании аннотации @Transactional - PullRequest
0 голосов
/ 24 мая 2018

Я столкнулся с проблемой, когда помещал в метод аннотацию @ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...