在嵌入式数据库中使用 JDBC 连接池有什么好处吗?

Are there benefits to using a JDBC connection pool with embedded databases?

将 HikariCP 之类的东西与 SQLite、H2 或 HSQLDB 等嵌入式数据库一起使用有什么优势吗? (最后两个也可以 运行 在服务器模式下,但我对此不感兴趣)

除了性能优势(我认为对于嵌入式数据库可以忽略不计)之外,我还对连接池提供的其他设施感兴趣,这些设施可以使代码更加简洁 and/or 健壮。

我认为这个问题与 this other one 的不同之处在于它更具体,因为它侧重于嵌入式数据库,并且在较小程度上侧重于 HikariCP。

我只能想到一种情况,

如果您在开发中使用嵌入式数据库而在生产中使用嵌入式数据库

An embedded database is useful during the development phase of a project

然后您可以在不更改代码(使用依赖注入)的情况下将相同的代码重复用于不同数据库的连接池。

Spring情况下选择第二个选项:

Spring Jdbc's embedded database support can be extended in two ways:

  1. Implement EmbeddedDatabaseConfigurer to support a new embedded database type, such as Apache Derby.

  2. Implement DataSourceFactory to support a new DataSource implementation, such as a connection pool, to manage embedded database connections.

连接池的存在主要是因为从头开始打开新连接是一项昂贵的操作。通常,它涉及 TCP/IP 握手、加密以及协议协商和身份验证。关闭连接时也有一些开销。

所以这最终归结为实施:打开新连接是否足够慢以保证重用?如果打开连接的总时间与其他操作消耗的时间相比相当可观,或者如果打开连接会导致严重延迟,那么连接池就有意义了。对于嵌入式数据库,差异应该很小,因为它们 运行 在与程序本身相同的内存 space 中。

但是,连接池也有一个有用的副作用,因为它限制了同时连接的最大数量。在没有连接池的服务器上,攻击者很容易发送大量请求,耗尽内存或导致拒绝服务。

从代码清晰和抽象的角度来看,连接池也很好,因为它们是完全透明的。如果您有一天决定从嵌入式迁移到 client/server,则无需进行任何更改。