首页 > 解决方案 > JDBC连接池获取和关闭频率

问题描述

我有一个应用程序,我需要在数据库中存储大量事件。这些事件以 5000 个事件/分钟的频率出现,事件总数可能高达数百万。

我正在使用 c3po 连接池。我计划做的是**从池中为应用程序获取一个连接**并使用相同的连接来持久化所有事件,如下所示:

  1. Connection conn = //创建连接
  2. Persistor persistor = new Peristor(conn)//注入上面创建的连接。

    persistor.persistEvent(Event e) { conn.write(e); }

每次写入后语句和结果集都会关闭,但我不会在每次持久后关闭连接(将其释放回池)。相反,当应用程序停止时,连接会关闭。

我运行了应用程序,在持续了大约 600,000 个事件之后,我使用了一个 heapdump(使用:jmap -dump:format=b,file=test-dump.hprof [PID])来检查堆中发生了什么。

我可以看到有一个消耗 500 MB 堆的巨大对象“com.mchange.v2.c3p0.impl.NewPooledConnection”。在分析对象时,我可以看到它包含同一对象(com.mchange.v2.c3p0.impl.NewPooledConnection)的嵌套对象的递归。

所以,问题是,对象是巨大的,因为我没有在每次写入后将连接返回到池,还是我做错了什么?

标签: javaperformancejdbc

解决方案


推荐阅读