1

我有一个 Java 批处理,它使用大的结果集进行选择(我使用 Spring 回调处理程序处理元素)。回调处理程序将任务放入固定线程池中以处理该行。我的 poolsize 固定在 16 个线程上。结果集包含大约 100k 个元素。所有数据库访问代码都通过 JdbcTemplate 或 Hibernate/Spring 处理,不存在手动连接管理。我曾尝试使用 Atomikos 和 Commons DBCP 作为连接池。

现在,我认为我的连接池中最多 17 个连接足以完成这批。一个用于选择,16 个用于连接池中更新某些行的线程。然而这似乎太天真了,因为我必须指定一个更大的最大池大小(没有尝试过确切的值),首先我尝试了 50 ,它在我的本地 Windows 机器上工作,但似乎不是在我们的 Unix 测试环境中已经足够了。在那里我必须指定 128 才能使其工作(同样,我什至没有尝试 50 到 128 之间的值,我直接选择了 128)。

这是正常的吗?我缺少连接池的一些基本机制吗?我发现很难调试它,因为我不知道如何查看打开的连接会发生什么。我尝试了各种 log4j 设置,但没有得到任何令人满意的结果。

编辑,附加信息:当连接池大小似乎太低时,批处理似乎挂起。如果我对进程执行 jstat,我可以看到所有线程都在等待新连接。起初我没有在 dbcp 连接池上指定 maxWait 属性,这会导致线程在新连接上无限期地等待,我注意到批处理一直挂起。所以没有释放连接。然而,这只发生在处理 +-70k 行之后,这以某种方式消除了我最初的连接泄漏预感。

edit2:我忘了提到我已经在我的任务中重写了更新部分。我在 ConcurrentLinkedQueue 中查询我的更新,我清空了 1000 个元素。所以我实际上只做了大约 100 次更新。

edit3:我正在使用 Oracle,并且正在使用并发工具。所以我有一个配置为 16 的固定池大小的执行器。我在这个执行器上提交我的任务。我不在我的任务中手动使用连接,我使用线程安全的 jdbctemplate 并询问它来自连接池的连接。我想 Spring/DBCP 处理连接/线程问题。

4

2 回答 2

1

如果您使用的是 linux,您可以尝试使用 MySql 管理员以图形方式监控您的连接状态,前提是您使用的是 MySQL。

尽管如此,对于大型企业应用程序来说,即使是 100 个连接也并不少见,每分钟处理几千个请求。

但是如果请求很少或者每个请求不需要唯一的事务,那么我建议您在线程内调整您的操作。

也就是说,您如何将 100k 元素分配给 16 个线程?如果您每次从共享位置(或缓冲区)读取一行时都尝试获取连接,那么预计需要时间。

看看这是否有帮助。

  1. 获取连接
  2. 对于每个元素,直到缓冲区大小变为零
  3. 处理它。
  4. 如果您需要更新,
  5. 开启交易
  6. 更新
  7. 提交/回滚事务
  8. 转到第 2 步
  9. 释放连接

您可以使用java.util.concurrent 集合同步缓冲区

不要为每个元素使用一个 Runnable/Callable。这会降低性能。另外你是如何创建线程的?使用 Executors 来运行你的 runnable/callable。还要记住,数据库连接不应该跨线程共享。因此,一次在 1 个线程中使用 1 个连接。

例如。创建一个 Executor 并提交 16 个 runnalbles,每个 runnalbles 都有自己的连接。

于 2012-02-29T18:01:51.757 回答
0

我切换到 c3p0 而不是 DBCP。在 c3p0 中,您可以指定多个辅助线程。我注意到,如果我将该数字设置为与我正在使用的线程数一样高,则连接数保持非常低(使用方便的 c3p0 的 jmx bean 来检查活动连接)。此外,我有几个依赖关系,每个都有自己的实体管理器。显然,每个实体管理器都需要一个新连接,所以我有大约 4 个实体管理器/线程,这可以解释大量连接。我认为我的任务都很短暂,以至于 DBCP 无法跟随关闭/释放连接,因为 c3p0 的工作方式更加异步,并且您可以指定辅助线程的数量,它能够及时释放我的连接。

edit: but the batch keeps hanging when deployed to the test environment, all threads are blocking when releasing the connection, the lock is on the pool. Just the same as with DBPC :(

edit: all my problems dissapeared when I switched to BoneCP, and I got a huge performance increase as bonus too

于 2012-03-02T08:15:35.800 回答