HikariCP: Тайм-аут после 30000 в ожидании соединения - PullRequest
0 голосов
/ 17 мая 2018

Я работаю над приложением Spring-MVC, где мы используем HikariCP.Мы используем PostgreSQL в качестве базы данных с 150 подключениями в PostgreSQL и 15 размерами пула для Hikari.Время от времени мы внезапно получаем ошибку, что тайм-аут произошел.Ошибка уходит через 10-20 секунд, но она замедляет весь сервер.Много раз это даже не занято.Я пробовал некоторые другие темы и добавил обнаружение утечек, но без помощи.Есть идеи, что я делаю не так или как это исправить?

Журнал ошибок:

java.sql.SQLTimeoutException: Timeout after 30000ms of waiting for a connection.
        at com.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:233)
        at com.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:183)
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:110)

root-context.xml:

<beans:bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"  destroy-method="close">
    <beans:property name="dataSourceClassName" value="org.postgresql.ds.PGSimpleDataSource"/>
    <beans:property name="minimumIdle" value="2"/>
   <beans:property name="maximumPoolSize" value="17" />
    <beans:property name="maxLifetime" value="300000" />
    <beans:property name="idleTimeout" value="25000" />
    <beans:property name="leakDetectionThreshold" value="3000"/>
    <beans:property name="dataSourceProperties">
        <beans:props>
            <beans:prop key="url">jdbc:postgresql://localhost:5432/DB_NAME</beans:prop>
            <beans:prop key="user">USERnamE</beans:prop>
            <beans:prop key="password">PASSWORD</beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>

<!-- Hibernate 4 SessionFactory Bean definition -->
<beans:bean id="hibernate4AnnotatedSessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource"/>
    <beans:property name="packagesToScan" value="com.ourapp.spring.model"/>
    <beans:property name="hibernateProperties">
        <beans:props>
            <beans:prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL9Dialect</beans:prop>
            <beans:prop key="hibernate.show_sql">false</beans:prop>
            <beans:prop key="hibernate.jdbc.batch_size">50</beans:prop>
            <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop>
            <beans:prop key="cache.use_second_level_cache">true</beans:prop>
            <beans:prop key="cache.use_query_cache">true</beans:prop>
            <beans:prop key="hibernate.order_updates">true</beans:prop>
            <beans:prop key="show_sql">false</beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>

Любая помощь будет полезной.Спасибо.: -)

Обновление

Типичное сохранение и чтение:

@Repository
@Transactional
public class AppDetailsDAOImpl implements AppDetailsDAO {

    private final SessionFactory sessionFactory;
    @Autowired
    public AppDetailsDAOImpl(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }


    @Override
    public Long saveAppDetails(AppDetails appDetails, int personid) {
        Session session = this.sessionFactory.getCurrentSession();
        Person person = (Person) session.get(Person.class, personid);
        if (person != null) {
            person.getAppDetailsSet().add(appDetails);
            appDetails.setUserApps(person);
            Long saveid = (Long) session.save(appDetails);
            session.flush();
            return saveid;
        }
        return (long) 0;
    }

    @Override
    public AppDetails getAppDetailsByAppId(Long appId) {
        Session session = this.sessionFactory.getCurrentSession();
        return (AppDetails) session.get(AppDetails.class, appId);
    }
}

Ответы [ 2 ]

0 голосов
/ 31 июля 2018

изменить драйвер Postgres и изменить настройки для hikaricp

spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=2000000
spring.datasource.hikari.connectionTimeout=30000   
spring.jpa.hibernate.connection.provider_class=org.hibernate.hikaricp.internal
.HikariCPConnectionProvider
0 голосов
/ 18 мая 2018

У вас закончились соединения из-за бизнес-логики вашего приложения. Как вы сказали:

проблема в том, что у меня в основном короткие транзакции и очень редко длинные транзакции

Вместо увеличения размера пула для краткосрочных транзакций объявите отдельный новый компонент DataSource для долгосрочных транзакций. Этот новый DataSource должен быть поддержан новым пулом HikariCP. Он может даже иметь минимальный размер 0, поскольку стоимость установления нового соединения с базой данных должна быть незначительной, если вы выполняете длительную транзакцию, например ежемесячный отчет.

Разделение обработки OLTP и OLAP является правильным подходом, например, см. CQRS . Например, вы можете ежедневно обновлять отдельную базу данных OLAP для обработки отчетов, в то время как основная база данных OLTP не зависит от трудоемких рабочих нагрузок отчетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...