我的应用程序没有使用任何形式的连接池,而是直接使用连接。该应用程序主要用于简短、简单的查询。从日志中我可以看到,它经常打开和关闭连接,通常只执行一行或几行之间的单个选择。这些通常需要100 the (包括打开和关闭连接)。
关于连接池如何提高应用程序性能,有无数的文章和博客条目,但它们似乎都相当古老(5年或更长时间)。
连接池是否仍然提供了合理的性能效益,或者已经过时了。我正在使用Microsofts驱动程序3.0版本的SQLServer 2008,如果这很重要的话。
结果/更新:自从我问了这个问题之后,发生了很多事情(我们切换JDBC驱动程序和其他很多东西)。有一段时间,我做了很多重构和其他事情,在那个时候,统一也给应用程序添加了连接池。通过连接池,现在执行一些查询的速度要快于日志时间戳粒度(我相信小于16 can )。
因此,总之,如果您需要频繁地连接/断开连接,是的连接池仍然是值得的。
发布于 2011-07-01 03:01:30
如果每个查询100毫秒对你来说是可以的,那么你不需要一个连接池。如果您需要小于20 ms的查询,重用连接是必不可少的。
如果您的驱动程序支持它自己的连接池,我建议您使用它(以防它已经为您这样做了)。只有当您希望更好地控制连接如何池时,您才可以使用额外的库(我自己从来没有找到一个好的库)。
注意:您不需要使用池来重复使用连接。
重用连接的一种简单方法是拥有一个持久连接(该连接具有适当的线程安全防护措施),如果您的查询不频繁,这可能就是您所需要的。
如果希望能够并发执行查询,并且只有几个执行查询的线程,则可以将连接存储在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()以在返回之前测试该连接。
发布于 2011-07-01 02:47:44
这在一定程度上取决于数据库软件。有些(例如MySQL)具有相对轻量级的连接,可以快速打开。其他的,如Oracle,有连接是很大的喇叭结构和严重的开销。
不过,一般来说,使用连接池是个好主意,特别是对于快速、短、大容量的查询。应用程序包含连接的速度越快,它就变得越重要。在过去的几年里,这种情况并没有改变--如果说有什么变化的话,那就是随着应用程序的扩展和变得更加复杂,它比以往任何时候都更重要。
如果你需要说服,我建议你做一些基准,与池和不。如果你在你的具体情况下没有得到任何性能上的好处,那么也许这不值得你去做。
https://stackoverflow.com/questions/6546911
复制相似问题