2013-03-04 1 views
1

Я изучаю Ruby. Я пытаюсь подключиться к MySQL db, используя mysql gem. Одна из моих проблем - закрытие соединения.Как обеспечить подключение к базе данных в Ruby?

Как я могу обеспечить закрытие соединения в непредвиденных ситуациях, таких как исключение?

+0

Это то, что 'begin' /' rescue'/'обеспечить' (aka' try'/'catch' /' finally') для. – 2013-03-04 05:12:51

ответ

1

Вы имеете в виду, что-то вроде этого?

begin 
    db = open_mysql_connection 
    # do stuff 
ensure 
    # this block is always executed, even if exception is raised 
    db.close 
end 
+0

BTW, комментарий должен быть прочитан: «этот блок _almost_ всегда выполняется». Если другой поток отправляет 'raise' или' kill' после того, как вы ввели это условие, но перед выполнением db.close соединение может протекать. stdlib's ['Timeout :: timeout'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/timeout/rdoc/Timeout.html#method-c-timeout) использует именно такую ​​по своей сути небезопасную нить гонки, чтобы сделать свой бизнес. – dbenhur

+0

@dbenhur: интересно, нужно заглянуть в него. –

+0

Чарльз Нуттер подробно описывает неотъемлемую черту «Thread # raise» и друзей: [Ruby's Thread # raise, Thread # kill, timeout.rb и net/protocol.rb библиотеки повреждены] (http: //blog.headius .com/2008/02/рубинового threadraise-threadkill-timeoutrb.html) – dbenhur