【问题标题】:Are there benefits to using a JDBC connection pool with embedded databases?将 JDBC 连接池与嵌入式数据库一起使用有什么好处?
【发布时间】:2018-03-26 22:23:35
【问题描述】:
将 HikariCP 之类的东西与 SQLite、H2 或 HSQLDB 等嵌入式数据库一起使用有什么优势吗? (最后两个也可以在服务器模式下运行,但我对此不感兴趣)
除了性能优势(我认为嵌入式数据库可以忽略不计)之外,我还对连接池提供的其他设施感兴趣,这些设施可以使代码更简洁和/或更健壮。
我认为这个问题与this other one 的不同之处在于它更具体,因为它侧重于嵌入式数据库,并且在较小程度上侧重于 HikariCP。
【问题讨论】:
标签:
java
jdbc
connection-pooling
hikaricp
embedded-database
【解决方案1】:
存在连接池主要是因为从头开始打开新连接是一项昂贵的操作。通常,它涉及 TCP/IP 握手、加密以及协议协商和身份验证。关闭连接时也有一些开销。
所以这最终归结为实现:打开新连接的速度是否足够慢以保证重用?如果打开连接的总时间与其他操作消耗的时间相比相当可观,或者如果打开连接会导致严重的延迟,则连接池是有意义的。对于嵌入式数据库,差异应该很小,因为它们与程序本身在相同的内存空间中运行。
但是,连接池也有一个有用的副作用,因为它限制了同时连接的最大数量。在没有连接池的服务器上,攻击者可以轻松发送大量请求,耗尽内存或导致拒绝服务。
从代码清晰和抽象的角度来看,连接池也很好,因为它们是完全透明的。如果有一天您决定从嵌入式迁移到客户端/服务器,则无需进行任何更改。
【解决方案2】:
我只能想到一种情况,
如果您在开发嵌入式数据库和生产中使用不嵌入式数据库
嵌入式数据库在项目的开发阶段很有用
然后您可以在不更改代码的情况下将相同的代码用于不同数据库的连接池(使用依赖注入)。
在Spring 的情况下选择第二个选项:
Spring Jdbc 的嵌入式数据库支持可以通过两种方式进行扩展:
-
实施 EmbeddedDatabaseConfigurer 以支持新的嵌入式数据库类型,例如 Apache Derby。
-
实现 DataSourceFactory 以支持新的 DataSource 实现,例如连接池,以管理嵌入式数据库连接。