2008-09-23 92 views
2

我写了一个Java程序来添加和检索MS Access中的数据。目前它在大约3分钟内依次通过〜200K插入查询,我认为这很慢。我打算使用3-4个线程处理十万条记录的不同部分来重写它。我有一个复合的问题:使用多个线程更新同一个数据库会更快吗?

  • 会因为划分工作量或这有助于加快程序会是相同的,因为线程还是要访问数据库的顺序?

  • 你觉得呢战略将加速这一进程(除了我已经做了,除了使用Java的preparedStatement时查询优化)

回答

2

首先,不要使用Access。把你的数据移到别的地方 - SQL/Server - MySQL - 任何东西。访问内部的数据库引擎(称为Jet)速度慢得可怜。这不是一个真正的数据库;它适用于涉及少量数据的个人项目。它根本不缩放。

其次,线程很少有帮助。

JDBC到数据库连接是一个过程范围的资源。所有线程共享一个连接。

“但是等等,”你说,“我将在每个线程中创建一个唯一的Connection对象。”

贵族,但有时注定要失败。为什么?您的JVM和数据库之间的操作系统处理可能涉及一个套接字,它是您的所有线程共享的单个进程范围资源。

如果您有一个在所有线程之间共享的单一OS级I/O资源,则不会看到太多改进。在这种情况下,ODBC连接是一个瓶颈。而MS-Access是另一个。

3
  1. 不知道。不知道更多关于瓶颈是什么,我不能评论它是否会使它更快。如果数据库是限制器,那么更多的线程会降低速度。

  2. 我会将访问数据库转储到平面文件,然后批量加载该文件。批量加载允许比运行多个插入查询快得多的优化。

0

在现代多核机器上,使用多个线程来填充数据库可能会有所帮助。这取决于数据库及其硬件。试试看看。

1

使用MSAccess作为后端数据库,如果您从MSAccess中进行导入,您可能会获得更好的插入性能。另一种选择(因为你使用的是Java)是直接操作MDB文件(如果你是从零开始创建它,并且没有其他并发用户 - MS Access不能很好地处理),那么可以使用Jackess这样的库。

如果这些都不是你的解决方案,那么我建议在你的Java应用程序中使用一个分析器,看看它是否花费大部分时间等待数据库(在这种情况下添加线程可能不会帮助你很多),或者如果它正在处理和并行化将会有所帮助。

0

试试吧,看看它是否有帮助。我猜想不是因为瓶颈可能在磁盘访问和锁定表中,除非你可以找到一种方法将负载分割到多个表和/或磁盘上。

1

刺激批量加载方式可能是您最好的选择,但一切都值得尝试一次。请注意,您的瓶颈将成为磁盘IO,而多个线程可能会减慢速度。当多个用户对文件进行打击时,MS访问也会崩溃,这正是您的多线程方式的作用(做一个备份!)。如果性能仍然是一个问题,请考虑升级到SQL express

MS Access to SQL Server Migrations docs.

祝你好运。

1

我同意倾销Access将是最好的第一步。话虽如此......

在.NET和SQL环境中,我已经看到线程在最大化INSERT吞吐量方面的帮助。

我有一个应用程序接受异步文件丢弃,然后将它们处理成数据库中的表。

我创建了一个分析文件并将数据放入队列的加载器。该队列由一个或多个线程提供服务,该线程的最大值可以调整参数。我发现,即使在使用典型7200RPM驱动器的单核CPU上,工作线程的理想数量也是3.它缩短了加载时间几乎成比例的数量。关键是要平衡CPU瓶颈和磁盘I/O瓶颈的平衡。

因此,在批量复制不是选项的情况下,应考虑线程。

0

由于使用锁定策略,IIRC访问不允许多个连接到同一个文件。

我完全同意关于sql的转储访问权限。

相关问题