使用了DriverManagerDataSource但看到了连接池

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

我有一个关于 Spring 的

DriverManagerDataSource
的问题。

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

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

但是,当我们测试微服务时,当我们将查询负载增加到 10 个并发虚拟用户时,我们可以看到 10 个 ESTABLISHED tcp 连接,并且这 10 个连接在查询完成后仍然保持 ESTABLISHED 事件;当我们发起一个只有 1 个并发虚拟用户的新查询后,它们仅减少到 1 个连接。

如上症状说明确实建立了连接池。我现在很困惑:这个池是从哪里来的?

我尝试了这里提到的测试:https://mkyong.com/spring-boot/spring-boot-how-to-know-which-connection-pool-is-used/,但我得到了

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 spring-boot tomcat connection-pooling
1个回答
0
投票

org.springframework.jdbc.datasource.DriverManagerDataSource
不是连接池。这是
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.