@yuharu

Как избежать блокировки параллельных запросов в Postgresql?

Запускается 10 потоков из пула потоков ExecutorService. В каждом потоке создается соединение и выполняется 1 sql запрос и комититься. Сам по себе запрос большой выборки (select из нескольких таблиц) выполняется 1-2 минуты.
После запуска запросы висят и не выполняются. Отслеживание производилось из pg_stat_activity, где у 10 потоков (порой эти статистики менялись, то заблокирован, то нет) стоят следующие статусы:
5a041667f421d948147271.png

Они могут выполниться через час. Раньше такой проблемы не было в связи с меньшим количеством данных в таблицах при тех же запросах.

<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</property>
    <property name="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider</property>
    <property name="show_sql">true</property>
    <property name="log_statement">all</property>
    <property name="hibernate.hikari.dataSourceClassName">org.postgresql.ds.PGSimpleDataSource</property>
    <property name="hibernate.hikari.connectionTimeout">300000</property>
    <property name="hibernate.hikari.maximumPoolSize">35</property>
    <property name="hibernate.hikari.poolName">hicari</property>
    <property name="hibernate.hikari.dataSource.url"></property>
    <property name="hibernate.hikari.dataSource.user"></property>
    <property name="hibernate.hikari.dataSource.password"></property>
    <property name="hibernate.hikari.autoCommit">false</property>
    <property name="hibernate.current_session_context_class">thread</property>

    @Override
public List<SendObj> call() {
    List<SendObj> sendObjList = null;

    Session session = sessionFactory.getCurrentSession();
    session.getTransaction().setTimeout(200);
    session.getTransaction().begin();

...
//здесь происходит выполнение query.list()
...

    if (session.isOpen())
        session.getTransaction().commit();

    return sendObjList;
}
  • Вопрос задан
  • 1122 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы