当前位置: 主页 > JAVA语言

java使用连接池的好处-java使用jdbc连接sql

发布时间:2023-04-13 11:07   浏览次数:次   作者:佚名

Is connection pooling with JDBC still improving performance nowadays?

我的应用程序未使用任何形式的连接池java使用连接池的好处,我正在直接处理连接。该应用程序主要执行简短的查询。从日志中,我可以看到它经常打开和关闭连接,并且经常仅对其中一排或几排进行一次选择。这些通常需要100毫秒左右的时间(包括打开和关闭连接)。

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

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

结果/更新:自从我问了这个问题以来,发生了很多事情(我们切换了JDBC驱动程序和许多其他东西)。在某些时候,我做了很多重构和其他工作,并且在适当的时候,我还向该应用程序添加了连接池。

通过连接池,某些查询现在的执行速度快于日志时间戳粒度可以衡量的速度(我相信不到16ms)。

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

如果每个查询100毫秒适合您,则您不需要连接池。如果您需要少于20毫秒的查询,则重用连接至关重要。

如果您的驱动程序支持其自己的连接池,建议您使用该连接池(以防它尚未为您提供连接池)。仅当您希望更好地控制池的连接方式时,才可以使用其他库(从来没有发现对自己有用的库)

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

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

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

如果您想要多个连接,并且可以执行查询的线程多于连接中想要的线程,请使用池。

对于ThreadLocal模型,您可以执行

1

2

3

4

5

6

public static final ThreadLocal CONNECTION = new ThreadLocal() {

public Connection initialValue() {

LOG.info(Thread.currentThread()+": created a connection.");

return createConnection();

}

};

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

private static final Map connections = new ConcurrentHashMap();

public static final ThreadLocal CONNECTION = new ThreadLocal() {

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 entry: connections.entrySet()) {

Thread t = entry.getKey();

if (!t.isAlive()) {

LOG.info(t+": closed a connection.");

connections.remove(t);

entry.getValue().close();

}

}

}

如果您担心连接断开java使用连接池的好处,可以在返回之前重写ThreadLocal的get()来测试连接。

在某种程度上取决于数据库软件。有些(例如MySQL)具有相对较轻的连接,可以快速打开。其他公司,例如Oracle,则具有巨大的连接结构和严重的开销。

但是,通常来说,使用连接池是个好主意,尤其是对于快速,简短,大容量的查询。您的应用包含连接的速度越快,它就变得越来越重要。在过去的几年中,这种情况没有改变-如果有的话,随着应用程序的扩展和变得越来越复杂,它比以往任何时候都更加重要。

如果您需要说服力,我建议您进行一些基准测试(有池或无池)。如果在您的特定情况下没有获得性能上的好处,那么也许就不值得为此而烦恼。