我有一个关于 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的连接池是否自动启动了?
不是连接池。这是 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
类最初是与Apache Commons DBCP和C3P0一起设计的,具有bean风格的DriverManagerDataSource
BasicDataSource/ComboPooledDataSource
类以及用于本地资源设置的配置属性。对于现代 JDBC 连接池,请考虑使用
HikariCP,向应用程序公开相应的实例。HikariDataSource
如果你使用 Hibernate,你应该阅读
第一章。
1.1。正在连接 Hibernate 代表您的应用程序连接到数据库。它可以通过多种机制进行连接,包括: 单机内置连接池
javax.sql.DataSource
连接池,包括对两个不同的第三方开源 JDBC 连接池的支持:
c3p0proxool
应用程序提供的 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
中的值。一旦当前池大小不为空,您就无法打开任何新连接,因为连接提供程序从池中返回连接。