gpt4 book ai didi

java - 光CP : Timeout after 30000 waiting for a connection

转载 作者:行者123 更新时间:2023-11-29 14:32:02 26 4
gpt4 key购买 nike

我正在开发一个使用 HikariCP 的 Spring-MVC 应用程序。我们使用 PostgreSQL 作为数据库,PostgreSQL 有 150 个连接,Hikari 有 15 个池大小。有时,我们会突然收到超时错误。错误会在 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)

根上下文.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);
}
}

最佳答案

由于您的应用程序业务逻辑,您用完了连接。就像你说的:

the problem is I have mostly short running transactions and very rarely long running transactions

不是为短期运行的事务增加池大小,而是为长期运行的事务声明一个单独的新 DataSource bean。这个新的 DataSource 应该由新的 HikariCP 池支持。它的最小大小甚至可以为 0,因为如果您运行的是长时间运行的事务,那么建立新数据库连接的成本应该是微不足道的,例如月度报告。

将 OLTP 和 OLAP 处理分开是正确的方法,例如见CQRS .例如,您可以每天刷新一个单独的 OLAP 数据库来处理报告,而主 OLTP 数据库不受耗时报告工作负载的影响。

关于java - 光CP : Timeout after 30000 waiting for a connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50390414/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com