2011-01-19 60 views
4

哪种缓存策略速度更快,速度更快?每个连接缓存PreparedStatement还是让连接池处理它?

1)PreparedStatement池(由连接池)。没有应用程序缓存。

for (int i=0; i<1000; i++) { 
    PreparedStatement preparedStatement = connection.prepareStatement(sql); 
    preparedStatement.setObject(1, someValue); 
    preparedStatement.executeQuery(); 
    preparedStatement.close(); 
} 

2)应用程序级缓存。没有PreparedStatement池。

PreparedStatement preparedStatement = connection.prepareStatement(sql); 
for (int i=0; i<1000; i++) { 
    preparedStatement.clearParameters(); 
    preparedStatement.setObject(1, someValue); 
    preparedStatement.executeQuery(); 
} 
preparedStatement.close(); 

这个问题类似于Reusing a PreparedStatement multiple times除了我期待具体的基准测试结果以及采取的PreparedStatement集中考虑。

http://drupal.org/node/550124#comment-2224630似乎表明应用程序级缓存比PreparedStatement池更有效,但差异可以忽略不计。我想在下定决心之前看到更多的基准。

回答

1

这种微基准很少引出任何有用的数据。真实世界的使用情况将因使用模式,底层数据库实现,网络,数据库服务器上的内存以及其他内容而异。

为什么不直接编写代码以便它能够正常运行,并进行测试。然后,如果它证明速度太慢,您可以更新实施并确保该软件将继续工作。

+0

我想了解是否值得在框架中引入应用程序级缓存。这会影响用户群,因此针对特定用例进行优化并不会真正起到帮助作用。是否有一些我们可以修改的备受尊敬的数据库基准测试? – Gili 2011-01-19 16:42:22

+0

那么,有没有用户请求这个功能?如果没有,那么也许没有人需要它,你可以节省一些努力,而不是实现一个可能做得不多的新功能......只是一个念头! – time4tea 2011-01-19 19:44:22

-3

应用程序级缓存会更有效率,特别是如果您批量执行。

即使使用连接池,每次连接准备就绪(后退和第四次)以及每次关闭所需的网络开销也会使其不仅更慢,而且会增加SQL服务器和客户端上的CPU级别开销服务器。