Forum: JRuby Call .setQueryTimeout() for ActiveRecord statements

Posted by Kolbe Kegel (Guest)
on 2012-11-28 19:44
(Received via mailing list)
Hello,

My goal is to call the .setQueryTimeout() method on some underlying 
Statement object(s) used by ActiveRecord to execute queries on a MySQL 
database.

Does anyone know of a mechanism to either access the underlying 
Statement object myself to call this method, or can anyone suggest some 
approach that would cause .setQueryTimeout() to be called for each new 
Statement object created by ActiveRecord?

(I have seen 
http://stackoverflow.com/questions/5480780/how-do-... 
which suggests a solution that solves a different problem. 
Mysql::OPT_READ_TIMEOUT and Mysql::OPT_WRITE_TIMEOUT are very different 
things than Query Timeout, which actually causes a KILL QUERY statement 
to be executed on the server.)

Regards,

Kolbe
Posted by Richie Vos (Guest)
on 2012-11-28 20:08
(Received via mailing list)
If you use the jdbcmysql driver, you can do a lot with the url 
parameter.
With it you can pass in lower level configuration settings to the
underlying jdbc connection (for mysql these are documented at http://
dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html).
I've experimented with doing something like what you're saying with the
socketTimeout and connectTimeout parameters. We want to both limit the 
max
time a query can take, but also don't want to hang on connecting to the
database either.

If I want to set socketTimeout to 500ms and connectTimeout to 500ms, you
can have a database.yml that looks like:

production:
  user: root
  password: xyz123
  adapter: jdbcmysql

url: 
"jdbc:mysql://db_host_name/my_service_production?socketTimeout=500&connectTimeout=500"


And in your Gemfile:

gem 'activerecord-jdbcmysql-adapter', :platforms => [:jruby]


I haven't played with setQueryTimeout however, and not sure if it can be
configured in a similar way. And to be completely candid, I haven't 
rolled
this setting out to a production server yet. I'm also not sure if you'd
want just setQueryTimeout or if you'd still want socket/connect timeouts
also configured.
Posted by Kolbe Kegel (Guest)
on 2012-11-28 20:10
(Received via mailing list)
Hello Richie,

On 28Nov , 2012, at 11:06, Richie Vos <richie@groupon.com> wrote:

> If you use the jdbcmysql driver, you can do a lot with the url parameter. With 
it you can pass in lower level configuration settings to the underlying jdbc 
connection (for mysql these are documented at 
http://dev.mysql.com/doc/refman/5.0/en/connector-j...). 
I've experimented with doing something like what you're saying with the 
socketTimeout and connectTimeout parameters. We want to both limit the max time a 
query can take, but also don't want to hang on connecting to the database either.
>
> I haven't played with setQueryTimeout however, and not sure if it can be 
configured in a similar way. And to be completely candid, I haven't rolled this 
setting out to a production server yet. I'm also not sure if you'd want just 
setQueryTimeout or if you'd still want socket/connect timeouts also configured.

I might still want the socketTimeout and connectTimeout parameters to be 
set, and you're right that those can easily be set in the Connector/J 
connection URL, but there's no support for doing something similar with 
QueryTimeout, unfortunately. This could be a great feature request for 
those guys, but I'm still left wondering about some other way to call 
the setQueryTimeout() method for the time being :-/

Regards,

Kolbe
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.