Hi,
In commit 9051da90e4da2ab0db16530a7f7568e24a0ccaed the following line was added to MysqlAdapter#connect:
@connection.reconnect = true if @connection.respond_to? (:reconnect=)
There are couple of problems with this:
1. It doesn't stick. A look at the sources of the mysql gem tells that the real_connect method sets reconnect to 0 (false). Since real_connect is called after the line given about, it'll reset the value of reconnect to 0. A simple test for that will be:
def test_connection_has_mysql_reconnect_property @connection = ActiveRecord::Base.connection mysql_connection = @connection.instance_variable_get (:@connection) assert mysql_connection.reconnect end
This test fails. And it's easy to fix, we'll just move the line above to somewhere after the real_connect() call. (Unless, I'm missing something, of course.)
2. Even after I fixed #1, I couldn't make reconnect work in my tests. I did a simple test without AR (directly with mysql gem), and it works OK (you can see that reconnection happened because the thread_id of the connection is modified). However, with AR I keep getting the "MySQL server has gone away" errors. Here's my test (should be in connection_test_mysql.rb):
def test_select_auto_reconnects_after_connection_lost mysql_connection = @connection.instance_variable_get (:@connection) assert mysql_connection.reconnect
original_thread_id = mysql_connection.thread_id assert_equal ["42"], @connection.select_values('SELECT 42')
@connection.update('set @@wait_timeout=1') sleep 2
# this shouldn't raise Mysql::Error if reconnect is true assert_equal ["42"], @connection.select_values('SELECT 42') new_thread_id = mysql_connection.thread_id assert_not_equal original_thread_id, new_thread_id end
3. Do we want the reconnection at all? According to Mysql docs ( http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html ) the auto-reconnect does not save any session variables. This includes these two settings that AR sets after connection is established:
SET NAMES 'utf8' SET SQL_AUTO_IS_NULL=0
Which means, if the server was gone, auto-reconnect takes place on the next query, but the variables are back to the server default (use SHOW VARIABLES LIKE 'character_set_client' to view the variable value before and after the reconnection). On my machine it's back to 'latin1'.
See previous (related) discussion at: http://groups.google.com/group/rubyonrails-core/browse_thread/thread/a6a7eccf05b24c0
Best, dubek.