LMPX.COM |
Home | Linux | Mysql | PHP | XML | ||
|
|
|||
From: Tim Bunce Date: Fri Dec 9 05:38:06 2005 Subject: Re: Another feature request...
Much like my old catch phrase was "How does ODBC do it", my new catch phrase is "How does JDBC do it?" - but sadly that doesn't help us much here as Java doesn't have native support for coroutines. So, my next new catchprase comes into play: "can it be implemented as a subclass"? Meanwhile, at this point, I'll flag it as a "nice to have feature" for us to consider a little further down the road. Tim. On Fri, Dec 09, 2005 at 02:03:49PM +1100, Adam Kennedy wrote: > > > Sam Vilain wrote: > > On Thu, 2005-12-08 at 23:51 +0000, Tim Bunce wrote: > > > >>On Tue, Dec 06, 2005 at 01:57:58PM +1300, Sam Vilain wrote: > >> > >>>How about co-operation with coroutines (See the end of S17 in > >>>pugs/docs/AES) in DBI v2 ? > >>> > >>>Of course it would be heavily driver dependent :). But if there is > >>>anything that DBI could do to be coro-safe, that would be cool. > >> > >>Can you expand on this with some practical examples? > > > > > > How about "simple" to start off with. This one launches three queries > > "in parallel". > > > > my $dbh = DBI.connect(...); > > $dbh.begin_work; > > my @coros; > > for (1..3) { > > my $coro = coro { > > my $sth = $dbh.prepare(...); > > $sth.execute; > > for =$sth -> $row { > > # process result... > > } > > $sth.finish; > > }; > > $coro.ready; > > push @coros, $coro; > > } > > $_.join foreach @coros; > > $dbh.commit; > > > > Now, to understand this program, remember that a coroutine is a bit like > > a thread, but it doesn't need another process or OS thread; instead it > > uses defined preemption points. Coroutines don't suck in practical use > > like OS threads, because no matter how "lightweight" they are because > > you still need to protect access to all common data structures with > > locks, semaphores, etc. > > Or in Perl 6, with Software Transactional Memory. > > > The preemption points in the above are taken to be; the "join" (which > > waits for a coro to finish), and all the $dbh and $sth operations. Of > > course the Coroutine API is not finished so I made up .join and .ready. > > > > If the DBD is capable of handling multiple statements with a single > > database connection, then it could conceivably multiplex the execution > > of the blocks as data is returned. Otherwise, the first one's .prepare > > or .execute will not return until the lock is freed by the $sth.finish > > call. It is not acceptable to open separate database handles, because a > > transaction is open. Then again, if the driver doesn't support > > multiplexing, but supports cursors (and DBIv2 is capable of turning > > selects into cursors when it needs to), then cursors could be used to > > allow the parallelism. > > > > Does that explain much, or would something "practical" be better? > > I would be interested in a real example of where this is useful. I'd > also like to know if any database in existance supports this, or plans to. > > As for implementation (regardless of merit), since the main idea is to > encapsulate the larger chunks of functionality into Roles, I wouldn't > imagine it would be that hard to implement some form of > DBI2::Role::Cororoutine role... > > Adam K
| Navigate in group perl.dbi2.dev at sever nntp.perl.org | |
| Previous | Next |
| © No Copyright You are free to use Anything |
Site Maintained by PHP Developer
Powered By PHP Consultants |