首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >现在,使用JDBC的连接池是否仍能提高性能?

现在,使用JDBC的连接池是否仍能提高性能?
EN

Stack Overflow用户
提问于 2011-07-01 10:43:52
回答 2查看 2.5K关注 0票数 4

我的应用程序没有使用任何形式的连接池,而是直接使用连接。该应用程序主要用于简短、简单的查询。从日志中我可以看到,它经常打开和关闭连接,通常只执行一行或几行之间的单个选择。这些通常需要100 the (包括打开和关闭连接)。

关于连接池如何提高应用程序性能,有无数的文章和博客条目,但它们似乎都相当古老(5年或更长时间)。

连接池是否仍然提供了合理的性能效益,或者已经过时了。我正在使用Microsofts驱动程序3.0版本的SQLServer 2008,如果这很重要的话。

结果/更新:自从我问了这个问题之后,发生了很多事情(我们切换JDBC驱动程序和其他很多东西)。有一段时间,我做了很多重构和其他事情,在那个时候,统一也给应用程序添加了连接池。通过连接池,现在执行一些查询的速度要快于日志时间戳粒度(我相信小于16 can )。

因此,总之,如果您需要频繁地连接/断开连接,是的连接池仍然是值得的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-01 11:01:30

如果每个查询100毫秒对你来说是可以的,那么你不需要一个连接池。如果您需要小于20 ms的查询,重用连接是必不可少的。

如果您的驱动程序支持它自己的连接池,我建议您使用它(以防它已经为您这样做了)。只有当您希望更好地控制连接如何池时,您才可以使用额外的库(我自己从来没有找到一个好的库)。

注意:您不需要使用池来重复使用连接。

重用连接的一种简单方法是拥有一个持久连接(该连接具有适当的线程安全防护措施),如果您的查询不频繁,这可能就是您所需要的。

如果希望能够并发执行查询,并且只有几个执行查询的线程,则可以将连接存储在ThreadLocal字段中。

如果您想要多个连接,并且有更多可以执行查询的线程,则使用一个池。

对于ThreadLocal模型,您可以这样做

代码语言:javascript
运行
复制
public static final ThreadLocal<Connection> CONNECTION = new ThreadLocal<Connection>() {
     public Connection initialValue() {
         LOG.info(Thread.currentThread()+": created a connection.");
         return createConnection();
     }
};

如果您想控制连接的清理方式。

代码语言:javascript
运行
复制
private static final Map<Thread, Connection> connections = new ConcurrentHashMap();
public static final ThreadLocal<Connection> CONNECTION = new ThreadLocal<Connection>() {
     public Connection initialValue() {
         LOG.info(Thread.currentThread()+": created a connection.");
         Connection conn = createConnection();
         connections.put(Thread.currentThread(), conn);
         return conn;
     }
};
public static void cleanUp() {
     for(Map.Entry<Thread, Connection> entry: connections.entrySet()) {
         Thread t = entry.getKey();
         if (!t.isAlive()) {
             LOG.info(t+": closed a connection.");
             connections.remove(t);
             entry.getValue().close();
         }
     }
}

如果您关心的是获得一个死连接,您可以重写ThreadLocal的get()以在返回之前测试该连接。

票数 4
EN

Stack Overflow用户

发布于 2011-07-01 10:47:44

这在一定程度上取决于数据库软件。有些(例如MySQL)具有相对轻量级的连接,可以快速打开。其他的,如Oracle,有连接是很大的喇叭结构和严重的开销。

不过,一般来说,使用连接池是个好主意,特别是对于快速、短、大容量的查询。应用程序包含连接的速度越快,它就变得越重要。在过去的几年里,这种情况并没有改变--如果说有什么变化的话,那就是随着应用程序的扩展和变得更加复杂,它比以往任何时候都更重要。

如果你需要说服,我建议你做一些基准,与池和不。如果你在你的具体情况下没有得到任何性能上的好处,那么也许这不值得你去做。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6546911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档