URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7884
[ Назад ]

Исходное сообщение
"Потоки и DBI::Sybase"

Отправлено aizen , 05-Фев-09 17:35 
При попытке использовать DBI в потоках получаю ошибку:

thread failed to start: DBD::Sybase::db do failed: handle 2 is owned by thread 814c008 not current thread 845e040 (handles can't be shared between threads and your driver may need a CLONE method added)

Код:

use DBI;
use threads;

sub ms_do
{
    local @par=@_;
    $par[0]->do($par[1]);
}

my $mdbh=DBI->connect("dbi:Sybase:server=$server", $login, $pass);
my @thr;

push @thr, threads->create(\&ms_do,$mdbh,"delete from $database.$table1");
push @thr, threads->create(\&ms_do,$mdbh,"delete from $database.$table2");

foreach my $thread (@thr)
{
    $thread->join();
}

Соответственно вопрос: Что я делаю не верно? И есть ли возможность использовать многопоточность с DBI в perl?


Содержание

Сообщения в этом обсуждении
"Потоки и DBI::Sybase"
Отправлено NuINu , 05-Фев-09 21:40 
>[оверквотинг удален]
>push @thr, threads->create(\&ms_do,$mdbh,"delete from $database.$table1");
>push @thr, threads->create(\&ms_do,$mdbh,"delete from $database.$table2");
>
>foreach my $thread (@thr)
>{
>    $thread->join();
>}
>
>Соответственно вопрос: Что я делаю не верно? И есть ли возможность использовать
>многопоточность с DBI в perl?

причем тут DBI? у вас DBD ругается!
вполне возможно что данный драйвер не позволяет это сделать... посмотрите как он у вас собран. и есть ли вообще у него такаая возможность.

попробуйте открыть два дескриптора $mdbh


"Потоки и DBI::Sybase"
Отправлено angra , 06-Фев-09 02:23 
>Что я делаю не верно?

Используете DBI в тредах, хотя известно, что большинство DBD, да и сам DBI не threadsafe
>И есть ли возможность использовать многопоточность с DBI в perl?

Ну например обращаться к базе только из одного потока, а остальными ставить ему запросы в очередь.