2015-09-28 90 views
0

看起来我们可以通过在org.apache.commons.dbcp2.BasicDataSource上设置testOnBorrow=false来提高我们的性能。但是有什么风险?通过设置BasicDataSource属性testOnBorrow = false来提高Web应用程序/ rest-api性能,是否有风险?

default setting为真。

因此,使用默认值,每次从连接池中检索连接时,都会针对数据库执行验证查询以测试数据库是否有效。虽然该查询可能会很快运行(通常,“select 1”是查询)。它仍然涉及将数据发送到数据库(通常在另一台服务器上)并将结果读回。这需要时间,也许只有50ms,但是,如果没有必要,为什么会这样呢?

为了提高性能,我正在考虑设置testOnBorrow=false, testOnReturn=true, testOnCreate =true, testWhileIdle=true。而不是默认值。

因此,通过这种设置,看起来风险在于连接可能“变坏”,而您的数据库查询失败。但为什么会发生?特别是对于testOnReturn和testWhileIdle,似乎风险很小。什么可能导致连接在此设置中变坏?

+0

任何事情。从功能角度来看,您必须准备好在任何时候关闭连接而没有明显的原因。这也意味着在借用它时检查连接在功能意义上是无用的。但是从性能角度来看,你必须要问的是:最后一次空闲测试和第一个查询之间的连接可能会下降的可能性有多大?这将取决于很多事情。而且,持续的空闲测试会导致多少开销,而不是每次借用一次。 – biziclop

回答

1

请注意,正确性和性能都是理想的属性。在实践中,陈旧的连接是真正的问题,我们经常需要DBA /系统管理员来协助。正如您所暗示的那样,连接损坏不应该发生,但是由于网络条件而发生。

使用验证查询有助于快速识别损坏的连接并将其从池中丢弃。这将最终允许将新的连接对象添加到池中。这种自动恢复过程比IMO更理想。

相关问题