6

我正在使用 Oracle JDBC 驱动程序并评估 BoneCP。两者都实现了语句缓存。

我在问自己是否应该将其中一个用于语句缓存。你怎么看?每种方式的优点或缺点是什么?

4

1 回答 1

9

作为 BoneCP 的作者,我可以填写我的部分:

  • 如果您忘记正确关闭语句,使用池缓存可以为您提供堆栈跟踪。如果您使用的是 hibernate/spring jdbc 模板或其他一些托管连接,这无关紧要,因为它总是会为您关闭。

  • 语句缓存与每个连接绑定,因此如果您有 100 个连接并且每次都继续执行相同的语句,则每个连接都需要一段时间才能填满它的缓存。如果 DB 支持它,驱动程序可能会进行一些特殊的调整,只准备一次该语句,但这不在 JDBC 规范中,因此连接池将没有任何此类设施来为此优化。另一方面,您可以告诉池以 LIFO 模式为您提供连接,这将大大提高您命中热缓存的几率。

  • 性能方面应该不会有太大的差异,因为最终他们都试图重用一个语句。然而,一些驱动程序采用盲目的方法在方法级别进行同步,而在 BoneCP 中,我总是尝试使用尽可能细粒度的锁,因此理论上这应该提供更大的可伸缩性。

摘要:两者的性能应该大致相同——如果不是,它可能是某个地方的设计错误。

于 2011-05-27T11:53:09.140 回答