我有一个关于 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的连接池是否自动启动了?
感谢您的时间和帮助!
org.springframework.jdbc.datasource.DriverManagerDataSource
不是连接池。这是 javax.sql.DataSource
的简单实现,已自动连接到 Spring Boot 应用程序。
标准 JDBC DataSource 接口的简单实现,通过 bean 属性配置普通的旧 JDBC
,并从每个 getConnection 调用返回一个新的DriverManager
。Connection
注意:此类不是实际的连接池;它实际上并不池
s。 它只是作为成熟连接池的简单替代品,实现相同的标准接口,但在每次调用时创建新的Connection
s。Connection
对于 Jakarta EE 容器外部的测试或独立环境很有用,可以作为相应
中的DataSource
bean,也可以与简单的 JNDI 环境结合使用。池假设ApplicationContext
调用将简单地关闭Connection.close()
,因此任何支持Connection
的持久性代码都应该可以工作。DataSource
这个
类最初是与Apache Commons DBCP和C3P0一起设计的,具有bean风格的DriverManagerDataSource
类以及用于本地资源设置的配置属性。对于现代 JDBC 连接池,请考虑使用 HikariCP,向应用程序公开相应的BasicDataSource/ComboPooledDataSource
实例。HikariDataSource
如果你使用 Hibernate,你应该阅读
1.1。正在连接 Hibernate 代表您的应用程序连接到数据库。它可以通过多种机制进行连接,包括:
单机内置连接池
javax.sql.DataSource
连接池,包括对两个不同的第三方开源 JDBC 连接池的支持:
c3p0
proxool
应用程序提供的 JDBC 连接。这不是推荐的方法,并且由于遗留原因而存在
注意: 内置连接池不适用于生产环境。
Hibernate 通过作为服务契约的
接口根据需要获取 JDBC 连接。应用程序还可以提供自己的ConnectionProvider
实现来定义向 Hibernate 提供连接的自定义方法(例如,来自不同的连接池实现)。ConnectionProvider
Hibernate 自己的连接池算法非常初级。它旨在帮助您入门,不适用于生产系统,甚至不适用于性能测试。您应该使用第三方池以获得最佳性能和稳定性。只需将
属性替换为连接池特定设置即可。这将关闭 Hibernate 的内部池。hibernate.connection.pool_size
如果您没有配置数据源,那么 Hibernate 将使用
hibernate.connection.provider_class = org.hibernate.connection.DriverManagerConnectionProvider
此连接提供程序具有内置的基本连接池,您可以为其设置
,但它仅用于开发目的。切勿在生产环境中使用它。hibernate.connection.pool_size
在您的休眠配置中隐式使用
。默认情况下使用此提供程序,除非您使用属性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