使用Oracle DBI编写多线程Perl应用程序时,有没有人知道任何问题或问题?每个线程都有自己与Oracle的连接。
在最长的时间里,我被告知Perl与Oracle不支持多线程。
答案 0 :(得分:5)
Perl DBI通过其内部强制执行单线程,因此驱动程序一次只能在一个会话($dbh
)上激活。无论你有多少CPU。因此,不支持多线程(因为DBI中的所有内容都是单线程的),但在多线程应用程序中使用DBI(以及DBD :: Oracle)是安全的。
答案 1 :(得分:2)
嗯,DBI文档说不使用线程Perl,并指向Perlmonks post that explains that。文件告诉你不要这样做是一个很好的理由。
然而,我已经看到它在某些平台上运行得很好但在其他平台上却失败了。即使你让它发挥作用,它也肯定不便携。
答案 2 :(得分:1)
我在Perl中使用多线程来对Oracle数据库进行基准测试,我必须为每个线程创建一个数据库处理程序。
答案 3 :(得分:0)
是的,无论你是否使用Oracle,在Perl中使用线程都是一个非常糟糕的主意。
虽然理论上讲,如果每个人都使用自己的连接,它应该可以工作,perl 5.8 threads are fundamentally flawed。
如果您理解该文章并仍想使用Perl线程,那么祝您好运。
答案 4 :(得分:0)
前段时间我想让ad-hock实现正常工作......我将dbi作为有限资源处理连接,并使用文件锁定在Perl中的各个线程之间共享它机制。我的多线程应用程序只通过作为守护进程运行的单独perl脚本连接到dbi。
在Linux上,多线程结束是通过fork完成的,在Windows上我使用了默认的activeperl实现所带来的任何东西(我忘了)
我尝试让他们通过共享内存进行通信,但最终只是使用共享文件。 Linux具有可靠的附加模式,因此它是一块蛋糕。在Windows上,让它们同步更加困难。
最近我研究过数据库事务,每个线程实例都有自己与数据库的连接,并让数据库处理连接细节。
这是使用mysql,但我确信oracle支持事务。
apache :: dbi与mod_perl一起工作/很好地保持这些连接在脚本的每次运行之间保持活动状态(在我使用它之前,每个连接都非常耗时)。
您的结果会有所不同。
答案 5 :(得分:0)
您可以尝试使用shell“多线程”。在http://alexhanin.blogspot.com/2010/07/multithreading-with-nothing-but-korn.html中描述 你可以将你的perl放在shell包装器中,然后使用每个shell“thread”作为程序的单独实例。