У меня странная проблема с использованием PostgreSQL
с JPA
и Hibernate
.
По расписанию мое приложение запускает метод синхронизации, который обновляет несколько строк в базе данных.
Unfortunatley на каком-то этапе приложения зависает (выполняются дальнейшие запланированные операции).
При более внимательном рассмотрении базы данных используется:
select *
from pg_stat_activity
where (state = 'idle in transaction')
and xact_start is not null;
-[ RECORD 1 ]----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
datid | 16384
datname | db
pid | 29874
usesysid | 10
usename | dbuser
application_name | PostgreSQL JDBC Driver
client_addr | 172.18.0.4
client_hostname |
client_port | 50222
backend_start | 2020-01-08 09:05:59.121255+00
xact_start | 2020-01-08 09:06:10.678177+00
query_start | 2020-01-08 09:06:12.086945+00
state_change | 2020-01-08 09:06:12.16695+00
wait_event_type | Client
wait_event | ClientRead
state | idle in transaction
backend_xid | 582857
backend_xmin | 582857
query | select assets0_.project_id as project11_4_0_, assets0_.id as id1_4_0_, assets0_.id as id1_4_1_, assets0_.active as active2_4_1_, assets0_.assetid as assetid3_4_1_, assets0_.assettype as assettyp4_4_1_, assets0_.fix as fix5_4_1_, assets0_.name as name6_4_1_, assets0_.origin as origin7_4_1_, assets0_.os as os8_4_1_, assets0_.osversion as osversio9_4_1_, assets0_.project_id as project11_4_1_, assets0_.requestid as request10_4_1_, assets0_.routingdomain_id as routing12_4_1_ from asset assets0_ where assets0_.project_id=$1
backend_type | client backend
Я увидел, что один из самых простых селекторов зависает в idle in transaction
штат. Я предполагаю, что запрос не дал результатов, поэтому приложение ожидает его и не выполняет следующие операции. Можно ли как-то установить таймаут и правильно обработать исключения, возвращаемые этим типом поведения?