develooper Front page | perl.dbi.users | Postings from December 2008

Any chances to perform parallel (multithreaded) INSERTs?

From:
Stephan Austermühle
Date:
December 3, 2008 03:22
Subject:
Any chances to perform parallel (multithreaded) INSERTs?
Hi all,

with my Perl script I have to upload large amounts of data into various
tables of a SQL Server database. The actual upload process takes some (too
much) time although I am already using prepared statements. I am using
ithreads in my script so it would be easy to speed up the upload process
by parallelizing the INSERTs. Unfortunately this doesn't work: DBI
remembered me of some issues:

	Thread 12 terminated abnormally: DBD::ODBC::db prepare
	failed: handle 2 is owned by thread 100103370 not current
	thread 108773770 (handles can't be shared between threads
	and your driver may need a CLONE method added)

The explanation in the DBI docs finally put me over the edge that there is
an easy way of parallelizing:

	Threads and Thread Safety
	[...]
	However, the internal pointer data within the handles will
	refer to the DBI and drivers in the original interpreter.
	Using those handles in the new interpreter thread is not
	safe, so the DBI detects this and croaks on any method call
	using handles that don't belong to the current thread
	(except for DESTROY).

Now I am wondering if there are still any chances to workaround this and
to parallelize the INSERTs. My SQL statements are covered by a transaction
so I cannot let my threads create a database handle individually.

The Unix (Solaris) part of the ecosystem consists of Perl 5.8.8, DBI,
DBD::ODBC, unixODBC, and FreeTDS. The database is a Microsoft SQL Server
2005 database.

Thanks for your help!

Stephan




nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About