Spring Boot 连接池理解

Posted

技术标签:

【中文标题】Spring Boot 连接池理解【英文标题】:Spring boot connection pool understanding 【发布时间】:2017-10-16 09:06:51 【问题描述】:

在 Spring boot application.properties 文件中,我们有以下选项:

server.tomcat.max-threads = 100
server.tomcat.max-connections = 100
spring.datasource.tomcat.max-active = 100
spring.datasource.tomcat.max-idle = 30

这是我的存储库类

public interface UserRepository extends JpaRepository<Users,Integer>

这是服务类

@Service
@Transactional(rollbackFor = Exception.class)
public class UserService 

    @Autowired
    private UserRepository userRepository;
    public User getUserById(Integer id)return userRepository.findOne(id)

问题是,userRepository 如何创建与 DB 的连接以及它是否会使用我的应用程序属性文件中的连接池。我来自 JDBC 和 hibernate,在那里我使用 DataManager、DataSource、Connection 类来使用连接池,但是在 Spring Boot 中我没有这些类的任何代码行并且一切正常

【问题讨论】:

【参考方案1】:

它的工作原理与以前一样,但使用 Spring Boot,Spring 可以为您完成更多任务。 不管有没有 Spring,UserRepository 的 DAO 类都不会直接操作数据源,也不会直接创建 JDBC 连接。 这些由您正在使用的 EntityManagerFactory 实现操作。 使用 Spring-Hibernate,您仍然需要配置 EntityManagerFactory。 现在有了 Spring Boot,你就不需要配置了。 它为您完成。

Spring Boot 的新功能是您现在还可以配置服务器数据源属性:

server.tomcat.max-threads = 100
server.tomcat.max-connections = 100
spring.datasource.tomcat.max-active = 100
spring.datasource.tomcat.max-idle = 30

因为 Tomcat 服务器可以由 Spring Boot 应用程序本身启动。

This part of the Spring Boot documentation 给出数据源实现的优先顺序:

生产数据库连接也可以使用 池化数据源。这是选择特定算法的算法 实现:

我们更喜欢 Tomcat 池化数据源,因为它的性能和 并发,所以如果它可用,我们总是选择它。

否则,如果 HikariCP 可用,我们将使用它。

如果 Tomcat 池数据源和 HikariCP 均不可用 如果 Commons DBCP 可用,我们将使用它,但我们不会 在生产中推荐它,它的支持已被弃用。

最后,如果 Commons DBCP2 可用,我们将使用它。


更新: 在 Spring Boot 2.x 中,HikariCP 是默认的连接池机制。

【讨论】:

这是否意味着如果我不包括 spring.datasource.tomcat.max-active = 100 spring.datasource.tomcat.max-idle = 30 spring boot 为我使用默认值?

以上是关于Spring Boot 连接池理解的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 整合连接池

Spring boot 数据库连接池

Spring boot 数据库连接池

spring boot redis Lettuce连接池

spring-boot中tomcat的默认连接池?

spring boot整合Druid连接池