gpt4 book ai didi

java - 如今,使用 JDBC 的连接池是否仍在提高性能?

转载 作者:搜寻专家 更新时间:2023-11-01 01:47:07 25 4
gpt4 key购买 nike

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

关于连接池如何提高应用程序性能的文章和博客条目数不胜数,但它们似乎都很陈旧(5 年或更长时间)。

连接池是否仍然提供合理的性能优势,还是已经过时了。如果这很重要,我将 SQLServer 2008 与 Microsoft 的 JDBC 驱动程序版本 3.0 一起使用。


结果/更新:自从我提出这个问题后发生了很多事情(我们切换了 JDBC 驱动程序和许多其他东西)。有时我做了很多重构和其他事情,并且在那个时候还向该应用程序添加了连接池。通过连接池,一些查询的执行速度现在比日志时间戳粒度可以测量的速度更快(我相信不到 16 毫秒)。

总而言之,如果您需要频繁连接/断开连接,连接池仍然值得付出努力。

最佳答案

如果每个查询 100 毫秒对您来说没问题,那么您就不需要连接池。如果您需要少于 20 毫秒的查询,重用连接是必不可少的。

如果您的驱动程序支持自己的连接池,我建议您使用它(以防它还没有为您做这件事)。只有当你想更好地控制连接的池化方式时,你才可以使用一个额外的库(我自己从来没有找到一个很好的用途)

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

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

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

如果您需要多个连接,并且可以执行查询的线程多于您希望在连接中拥有的线程数,请使用池。

对于ThreadLocal模型你可以做

public static final ThreadLocal<Connection> CONNECTION = new ThreadLocal<Connection>() {
public Connection initialValue() {
LOG.info(Thread.currentThread()+": created a connection.");
return createConnection();
}
};

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

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()方法,在返回前测试连接。

关于java - 如今,使用 JDBC 的连接池是否仍在提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6546911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com