如何知道DriverManagerDataSource有连接池

问题描述 投票:0回答:1

我有一个关于 Spring 的

DriverManagerDataSource
的问题。

我们的微服务使用 Spring Boot 和 Hibernate 连接到 Druid 数据库。我们使用

DriverManagerDataSource
创建我们的
dataSource
实例。从
DriverManagerDataSource
的文档中,我们知道它没有正确的连接池实现。

但是,当我们测试微服务时,当我们将查询负载增加到 10 个并发虚拟用户时,我们可以看到 10 个“已建立”TCP 连接,并且即使在查询完成后,这 10 个连接仍保持“已建立”状态。当我们发起一个只有 1 个并发虚拟用户的新查询后,它们仅减少到 1 个连接。 如上症状说明确实建立了连接池。我现在很困惑:这个池是从哪里来的? 我尝试了

这里

提到的测试,但我得到了

Datasource = org.springframework.jdbc.datasource.DriverManagerDataSource@xxxx; (请忽略xxxx)。以下是微服务启动的部分内容,显示 Tomcat 已启动:

[30m2024-03-12 10:03:27,567[0;39m [34mINFO [0;39m [[34mmain[0;39m] [33morg.apache.juli.logging.DirectJDKLog[0;39m [,] - Starting service [Tomcat]`
[30m2024-03-12 10:03:27,568[0;39m [34mINFO [0;39m [[34mmain[0;39m] [33morg.apache.juli.logging.DirectJDKLog[0;39m [,] - Starting Servlet engine: [Apache Tomcat/9.0.86];

不确定Tomcat JDBC的连接池是否自动启动了?


java spring-boot hibernate tomcat connection-pooling
1个回答
0
投票

不是连接池。这是 javax.sql.DataSource

 的简单实现,已自动连接到 Spring Boot 应用程序。
标准 JDBC DataSource 接口的简单实现,通过 bean 属性配置普通的旧 JDBC 
DriverManager

,并从每个 getConnection 调用返回一个新的
Connection

注意:此类不是实际的连接池;它实际上并不池 
Connection

s。

它只是作为成熟连接池的简单替代品,实现相同的标准接口,但在每次调用时创建新的 Connection

s。
对于 Jakarta EE 容器外部的测试或独立环境很有用,可以作为相应
DataSource
中的

ApplicationContext

bean,也可以与简单的 JNDI 环境结合使用。池假设

Connection.close()
调用将简单地关闭
Connection
,因此任何支持
DataSource
的持久性代码都应该可以工作。
这个
DriverManagerDataSource
类最初是与Apache Commons DBCP和C3P0一起设计的,具有bean风格的

BasicDataSource/ComboPooledDataSource

类以及用于本地资源设置的配置属性。对于现代 JDBC 连接池,请考虑使用

HikariCP
,向应用程序公开相应的
HikariDataSource
实例。
如果你使用 Hibernate,你应该阅读

第一章。

1.1。正在连接 Hibernate 代表您的应用程序连接到数据库。它可以通过多种机制进行连接,包括: 单机内置连接池

javax.sql.DataSource

连接池,包括对两个不同的第三方开源 JDBC 连接池的支持:

c3p0

proxool

应用程序提供的 JDBC 连接。这不是推荐的方法,并且由于遗留原因而存在

注意: 内置连接池不适用于生产环境。

Hibernate 通过作为服务契约的 ConnectionProvider 接口根据需要获取 JDBC 连接。应用程序还可以提供自己的

ConnectionProvider

实现来定义向 Hibernate 提供连接的自定义方法(例如,来自不同的连接池实现)。

第 3.3 章 JDBC 连接

Hibernate 自己的连接池算法非常初级。它旨在帮助您入门,不适用于生产系统,甚至不适用于性能测试。您应该使用第三方池以获得最佳性能和稳定性。只需将 hibernate.connection.pool_size 属性替换为连接池特定设置即可。这将关闭 Hibernate 的内部池。

Hibernate 数据源

如果您没有配置数据源,那么 Hibernate 将使用 hibernate.connection.provider_class = org.hibernate.connection.DriverManagerConnectionProvider

此连接提供程序具有内置的基本连接池,您可以为其设置

hibernate.connection.pool_size
,但它仅用于开发目的。切勿在生产环境中使用它。

Hibernate 连接池

在您的休眠配置中隐式使用DriverManagerConfigurationProvider。默认情况下使用此提供程序,除非您使用属性

connection.provider_class

配置了它。


该提供程序还实现了一个非常基本的连接池。

“基本连接池”是什么意思。如果您运行应用程序,您可以在日志中看到

[DriverManagerConnectionProvider] >Using Hibernate built-in connection pool (not for production use!) [DriverManagerConnectionProvider] >Hibernate connection pool size: 20

您还可以通过休眠配置属性

connection.pool_size
设置此值。但是 
它不会限制您打开的最大连接数。

当池为空时,您可以打开任意数量的连接。提供程序在将连接返回到

closeConnection
上的池时将保持它们打开状态,除非当前池大小不超过属性 connection.pool_size 中的值。一旦当前池大小不为空,您就无法打开任何新连接,因为连接提供程序从池中返回连接。

    

© www.soinside.com 2019 - 2024. All rights reserved.