Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Long running SQL query via ActiveRecord blocking the entire Ruby process?

Reply
Thread Tools

Long running SQL query via ActiveRecord blocking the entire Ruby process?

 
 
estebanjang@gmail.com
Guest
Posts: n/a
 
      11-06-2007

To my surprise, a long running SQL query via ActiveRecord blocks an
entire Ruby process (all the other threads are blocked while the
thread that runs the SQL query is waiting for the result set)

Has anyone else found this to be the case? (am I mistaken?)
Is there any way to avoid this other than spawning a separate process?

[Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux]

-Steve

 
Reply With Quote
 
 
 
 
Szymon Rozga
Guest
Posts: n/a
 
      11-06-2007
It is my understanding that Ruby threads are green threads.

see: http://en.wikipedia.org/wiki/Green_threads
"Also a green thread may block all other threads if performing a
blocking I/O operation. In order to avoid these problems, green
threads must use asynchronous I/O operations, but the added complexity
increases latency."

I seem to remember reading about Ruby threads and IO blocking, but
cannot find it.

Hope the above answers some questions.

Does anyone know of a solution?

-Szymon

On Nov 6, 3:26 pm, (E-Mail Removed) wrote:
> To my surprise, a long running SQL query via ActiveRecord blocks an
> entire Ruby process (all the other threads are blocked while the
> thread that runs the SQL query is waiting for the result set)
>
> Has anyone else found this to be the case? (am I mistaken?)
> Is there any way to avoid this other than spawning a separate process?
>
> [Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux]
>
> -Steve



 
Reply With Quote
 
 
 
 
Jones, Brian - McClatchy Interactive
Guest
Posts: n/a
 
      11-06-2007
> To my surprise, a long running SQL query via ActiveRecord=20
> blocks an entire Ruby process (all the other threads are=20
> blocked while the thread that runs the SQL query is waiting=20
> for the result set)
>=20
> Has anyone else found this to be the case? (am I mistaken?)=20
> Is there any way to avoid this other than spawning a separate process?
>=20
> [Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux]


As far as I know, things like Mongrel obtain a global lock -> run the
request through rails -> and release the lock. Rails isn't thread safe,
and a great deal of hackery depends upon this non-threaded mode of
operation. To handle multiple requests, you'll need multiple processes.


I'm curious, do you have something attempting to run the same rails in
multiple ruby threads at the same time?

Brian

 
Reply With Quote
 
Jeremy Kemper
Guest
Posts: n/a
 
      11-06-2007
On 11/6/07, http://www.velocityreviews.com/forums/(E-Mail Removed) <(E-Mail Removed)> wrote:
> To my surprise, a long running SQL query via ActiveRecord blocks an
> entire Ruby process (all the other threads are blocked while the
> thread that runs the SQL query is waiting for the result set)
>
> Has anyone else found this to be the case? (am I mistaken?)
> Is there any way to avoid this other than spawning a separate process?


The postgres and oracle adapters support async queries which won't
block Ruby threads, or you can use any of the pure-Ruby database
drivers.

Forking processes is probably better though.

jeremy

 
Reply With Quote
 
snacktime
Guest
Posts: n/a
 
      11-06-2007
On Nov 6, 2007 12:30 PM, <(E-Mail Removed)> wrote:
>
> To my surprise, a long running SQL query via ActiveRecord blocks an
> entire Ruby process (all the other threads are blocked while the
> thread that runs the SQL query is waiting for the result set)
>
> Has anyone else found this to be the case? (am I mistaken?)
> Is there any way to avoid this other than spawning a separate process?
>


C extensions that block will block the whole process, as they
basically interrupt ruby's thread schedular while they are running.
Unless the extension is written with this in mind, which most are not.

Chris

 
Reply With Quote
 
ara.t.howard
Guest
Posts: n/a
 
      11-06-2007

On Nov 6, 2007, at 2:47 PM, Jeremy Kemper wrote:

> The postgres and oracle adapters support async queries which won't
> block Ruby threads, or you can use any of the pure-Ruby database
> drivers.
>
> Forking processes is probably better though.
>


i'll be releasing a background job manager for rails in a few
days... fyi.

a @ http://codeforpeople.com/
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama




 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Having compilation error: no match for call to (const __gnu_cxx::hash<long long int>) (const long long int&) veryhotsausage C++ 1 07-04-2008 05:41 PM
Build dynamic sql query for JSTL <sql:query> Anonymous Java 0 10-13-2005 10:01 PM
unsigned long long int to long double Daniel Rudy C Programming 5 09-20-2005 02:37 AM
Assigning unsigned long to unsigned long long George Marsaglia C Programming 1 07-08-2003 05:16 PM



Advertisments