vb.net - ADODB.connection上的最大同时连接数?

我计划每10秒下载1400股的股价。 下载是完美的,只消耗几毫秒。

下一步是每10秒将1400条记录写入1400个单独的mdb文件(即,每个mdb文件使用1个adodb.connection)。 我试图通过使用多个线程(不超过CPU线程数)来提高性能,每个线程负责一些连接。

只能使我意识到性能没有按预期的方式提高(更多线程不会提高性能),并且CPU负载不会随着更多线程而增加,这表明瓶颈在adodb.connection对象中。 但是,通过交替使用2个单独的连接字符串(不同的提供程序),可以提高性能,如下所示。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xxx

Provider=Microsoft.JET.OLEDB.4.0;Data Source=xxx

我还尝试将线程放入编译的.exe文件中,并同时使用多个实例调用它们(例如,具有12个线程和12个线程CPU的实例),并且性能得到了显着改善(并且随着实例的增加,CPU负载开始最大化)

提供者是整个过程的瓶颈吗?

还是有任何适当的方法来“复制”提供者以提高性能?

我不希望通过调用似乎很难管理的.exe来执行程序

我还注意到,VB.net项目中的同时连接总数不能超过64,否则将弹出错误消息:

运行时错误-2147467259(80004005)自动化错误,未指定的错误

有什么办法可以增加64个连接的限制?

您应该能够将每个任务作为.net中的单独线程启动。 真正的问题是,当您尝试使用6个内核重载代码时,您只会得到6倍的增长。 主要瓶颈? 即使您要让所有6个核心都运行thead? 您可能只会看到处理器使用量的一小部分! 但为什么?

那么,虽然.net(甚至VBA)每秒可以轻松执行十亿条指令? 那么问题就变成了打开文件的大量时间。

如果打开文件? 然后,操作系统在这里发挥了重要作用。 操作系统将检查权限。 操作系统检查文件是否存在。 然后,它检查是否有人打开它。 然后,病毒软件可能会扫描文件或执行其他操作。 然后Access中的ACE / JET数据引擎开始工作。 它检查是否由其他人打开(如果是,则以多用户模式打开文件)。如果不是多用户模式,则打开文件以供单用户高速使用。 现在,我可以在这里再插入约100多个步骤。

但是,上述所有步骤都不是您的代码! 以上所有事情都是由OS发生和完成的-您可以完成的所有代码就是WAIT和WAIT。 因为上面的内容意味着您正在使用文件系统,所以您的代码将坐下来等待很长时间。 结果,您正在等待目录信息和所有内容的加载。 这些事情需要很多时间。 因此,CPU将等待输入/输出,并等待文件目录加载,然后对其进行扫描。 因此,一切都变成了输入/输出(I / O)约束,而不是处理器约束。 结果,您将看到非常低的CPU使用率百分比,因为实际上所有事情都在花时间等待文件打开和加载。 是什么时候打开并获取文件句柄并开始将数据流入Access数据库? 好吧,几年前我做了一些基准测试。 它大约有100,000条数据流记录。 换句话说,如果已经打开数据库并且您要保存100,000行数据,则打开一个数据库文件的时间大约是同一时间!

那么,如果您打开10个数据库? 好吧,如果您已经打开过一次,则可以在同一时间将100万行数据写到一个数据库中! 现在,有了更好的操作系统和文件系统,多核了吗?

那么100,000行数据=打开一个数据库文件规则? 它可能已经改变了,情况可能会好得多。 但是我们仍然要向表中写入至少10,000行数据,因为打开一个数据库需要花费相同的时间和金钱!!!

您当然可以在启动时打开1400个文件(数据库)。 但是,我必须认为这里使用的设计和方法存在严重错误。 完全没有实现总体目标,但是1400个数据库似乎不是一个可行的解决方案,并且会抛出更多的CPU,并且更多线程化处理此问题不会带来很多可行的解决方案。 虽然您可能获得1400个线程,但OS文件系统将提示这些请求并以不太出色的并行方式处理它们。

更糟吗? 访问数据库引擎(ACE / JET)的代码已有30多年的历史了。 它不是托管代码,当然也不是线程代码。 但是,如果您创建了1400个单独的文件打开实例,则它们应该可以正常播放,但是无法共享连接对象等。 因此,您需要1400个单独的连接对象,然后打开1400个单独的文件。 那么,如果您构建一个类并创建1400个实例,然后将每个实例作为与.net分开的线程启动? 这应该可以工作,但是如前所述,使用6个内核,您将只能同时运行6个实际线程并解决该问题。 而且这些线程中的每个线程仍将受到操作系统的瓶颈,操作系统将查询文件打开和文件管理部分。 我不知道Windows(例如版本10)允许多少个文件线程,但是如果您设法打开1400个文件,文件系统仍将是此处的主要瓶颈。

正如我所说,打开数据库的成本至少要使10,000行数据流到已经开放的数据库中,以备数据流。

因此,除非从一开始就打开1400个文件,否则从性能的角度来看,在此过程中不能打开这么多文件-它必须是一次性的。

然后,您实际上确实需要打开一个数据库文件,并且内部有1400个表(因为仅打开了一个文件)。

但是,再来代替1400个文件吗? 为什么不将一列添加到可区分1400个表的一个数据表中,现在我们一路向下到一个文件和一个表。

您必须提供更多详细信息,为什么不能在此处使用一个表。 这可能是您的最佳选择和解决方案。 您可以在一个数据库中考虑1400个表,但是在这里根本不建议打开1400个数据库。

转载请注明来自askonline.tech,本文标题:vb.net - ADODB.connection上的最大同时连接数?


 Top