Тайм-аут запроса JpaPagingReader во время выбора - PullRequest
0 голосов
/ 11 июля 2019

У меня есть весеннее пакетное задание, которое начинается с чтения всех строк в таблице с помощью JpaPagingReader.После 9 выбора исключение пружинного запроса

javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1514) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.Query.getResultList(Query.java:135) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1537) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1505) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    ... 159 common frames omitted
Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 10002ms.
    at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:676) ~[HikariCP-3.2.0.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:190) ~[HikariCP-3.2.0.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:155) ~[HikariCP-3.2.0.jar:na]
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) ~[HikariCP-3.2.0.jar:na]
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:106) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    ... 179 common frames omitted

Это мои свойства соединения

  datasource:
    url: jdbc:postgresql://localhost:5432/kkpostgres
    username: postgres
    password: admin
    driver-class-name: org.postgresql.Driver
    hikari:
      connection-timeout: 10000
      maximum-pool-size: 10
      idle-timeout: 30000
      leak-detection-threshold: 600000

И это код моего читателя

@Component
public class EmployeeDBReader implements ItemReader<EmployeeEntity> {

    private final EntityManagerFactory entityManagerFactory;

    public EmployeeDBReader(EntityManagerFactory entityManagerFactory) {
        this.entityManagerFactory = entityManagerFactory;
    }

    @Override
    public EmployeeEntity read() throws Exception {
        JpaPagingItemReader<EmployeeEntity> reader = new JpaPagingItemReader<>();
        reader.setEntityManagerFactory(entityManagerFactory);
        reader.setQueryString("SELECT e FROM EmployeeEntity e");
        reader.setTransacted(false);
        reader.open(new ExecutionContext());
        var entity = reader.read();
        return entity;
    }
}

Дополнительно у меня естьвопрос, что можно сделать тот же читатель, но с помощью JpaRepository?

1 Ответ

0 голосов
/ 12 июля 2019

Хорошо, я нашел более приятный способ сделать это. Я использовал RepositoryItemReader, который лучше в моем случае, потому что я использую jpa. Код выглядит как показано ниже.

@Component
public class EmployeeDBReader implements ItemReader<EmployeeEntity> {

    private static final String QUERY_METHOD_NAME = "findAll";

    private final EmployeeRepository employeeRepository;
    @Setter
    private RepositoryItemReader<EmployeeEntity> repositoryItemReader;

    public EmployeeDBReader(EmployeeRepository employeeRepository) {
        this.employeeRepository = employeeRepository;
        instantiateItemReader();
    }

    private void instantiateItemReader() {
        setRepositoryItemReader(new RepositoryItemReader<>());
        repositoryItemReader.setRepository(employeeRepository);
        repositoryItemReader.setMethodName(QUERY_METHOD_NAME);
        repositoryItemReader.setMethodName("findAll");
        Map<String, Sort.Direction> sortMap = new HashMap<>();
        sortMap.put("id", Sort.Direction.ASC);
        repositoryItemReader.setSort(sortMap);
        repositoryItemReader.setPageSize(1);
        repositoryItemReader.setSaveState(true);
    }

    @Override
    public EmployeeEntity read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        repositoryItemReader.open(new ExecutionContext());
        return repositoryItemReader.read();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...