Spring Data JPA连接太多

jjjwad0x  于 2022-11-23  发布在  Spring
关注(0)|答案(1)|浏览(255)

我和我的同事们正在做一个SpringBoot项目,我们同时工作,我们都连接到同一个mysql数据库。问题是,过了一段时间,我们中的一些人将不再能够连接,错误是太多的连接,现在我和数据库管理员谈过,他将最大连接数提高到500(在此之前大约为150),但我们仍然收到错误,如何修复此错误?我们使用的唯一配置属性如下:

spring.datasource.url= ...
spring.datasource.username= ...
spring.datasource.password= ...
spring.datasource.hikari.maximum-pool-size=25

也许jpa每次执行查询时都会打开一个新的连接,但没有关闭它?我不知道,我对此一无所知
编辑:我被要求展示一些关于与数据库交互的代码,下面是:

@Autowired
private EmployeeDAO employeeDAO;
@Autowired
private LogDAO logDAO;
@Autowired
private ContrattoLavoroDAO contrattoLavoroDAO;

    @Override
    public void deleteEmployeeById(Long idEmployee, String username) {
        contrattoLavoroDAO.deleteContrattoByEmpId(idEmployee);
        employeeDAO.deleteById(idEmployee);
        LogEntity log = new LogEntity();
        LocalDateTime date = LocalDateTime.now();
        log.setData(date);
        log.setUser(username);
        log.setCrud("delete");
        log.setTabella("Employees");
        log.setDescrizione("l'utente " + username + " ha rimosso il dipendente con matricola " + idEmployee);
        logDAO.save(log);
    }

下面是DAO的模型:

public interface ContrattoLavoroDAO extends JpaRepository<ContrattoLavoroEntity, Long> {

    @Modifying
    @Query(value = "DELETE contratto_lavoro, employee_contratto FROM contratto_lavoro" + " INNER JOIN"
            + " employee_contratto ON employee_contratto.id_contratto = contratto_lavoro.id_contratto" + " WHERE"
            + " contratto_lavoro.id_contratto = ?1", nativeQuery = true)
    public void deleteContrattoByEmpId(Long empId);
}
gojuced7

gojuced71#

您将Hikari最大池大小设置为25,这对于开发环境来说是相当高的。
不过这应该不是问题,因为这只是最大值,对吧?
Hikaris的文件上说:
🔢minimumIdle此属性控制HikariCP尝试在池中维护的最小空闲连接数。如果空闲连接数低于此值,并且池中的总连接数小于maximumPoolSize,HikariCP将尽最大努力快速有效地添加其他连接。但是,为了获得最大性能和对高峰需求的响应,我们建议不要设置此值,而是允许HikariCP充当固定大小的连接池。默认值:与maximumPoolSize相同
🔢maximumPoolSize此属性控制池允许达到的最大大小,包括空闲连接和正在使用的连接。基本上,此值将确定到数据库后端的实际连接的最大数量。最好根据您的执行环境确定此值的合理值。当池达到此大小,并且没有空闲连接可用时,对getConnection()的调用将在超时前阻塞connectionTimeout毫秒。请阅读有关池大小的信息。默认值:10
如果我没看错的话,这意味着您团队中的每个开发人员在启动应用程序时都会打开25个连接。当他们开始集成测试时,会打开另外25个连接,这会启动一个新的应用程序上下文。如果测试套件的测试有不同的配置,则每组配置都将使用自己的25个连接。
快速的解决方案是为您的开发环境显著减少maximumPoolSize。我推荐使用2。这足以允许一个正常事务和一个后台进程。如果应用程序需要更多的连接,它将抛出异常,这可能是一件好事,因为在大多数情况下它不应该抛出异常。
在此之上,您可能希望将minimumIdle设置为10,这样,如果应用程序只是运行,因为还没有人关闭它,应用程序就不会消耗共享资源。
中期,您可能希望摆脱为开发使用中央数据库的做法。随着TestContainers的出现,没有理由不为每个开发人员使用本地数据库。作为一个不错的副作用,它将确保所有的模式更新脚本都能正常工作。

相关问题