2012-07-17 2 views
0

Ruby에서 스크립트가 실행 된 후 일정 시간이 지나면 'mysql has been away away'오류가 발생합니다.Ruby mysql gem의 'reconnect'객체 변수

연결이 끊어지면 자동으로 다시 연결하도록 mysql gem에 알려 주려고합니다.

나의 현재 코드처럼 보이는 다음

def self.connect() 
    begin 
    if [email protected]@dbh.nil? 
     self.disconnect 
    end 
    @@dbh = Mysql.real_connect(@@server, @@user, @@pass, @@db) 
    puts "[+] Connected to the " + @@db + " database with user '" + @@user + "'" 
    rescue Mysql::Error => e 
    # log error 
    end 
end 

[0] MySQL의 보석은 '재 연결'개체 변수를 가지고 있다고 말한다 다음 가이드 그러나, 나는 내에서 그것을 사용하는 방법이 확실하지 오전 내 암호.

위의 코드에이 옵션을 어떻게 구현합니까? 사전에

감사합니다, 라이언

[0] http://www.tmtm.org/en/mysql/ruby/

편집 --- OK

. 나는 그것을 알아 냈다고 생각한다.

@@dbh = Mysql.real_connect(@@server, @@user, @@pass, @@db) 줄 뒤에 @@dbh.reconnect = true을 추가해야합니다.

참고 : IRC의 'nice'chapy에 따르면 mysql 젬은 사용할 최상의 Ruby 젬이 아닐 수 있습니다.

+1

'@@'클래스 변수에 너무 의존하는 특별한 이유가 있습니까? 이것은 스택 오버 플로우 구문 형광펜이 무엇을 만들지 알지 못하는 점에서 비 통상적입니다. – tadman

+0

나는 그 추론이 무엇인지 잘 모르겠습니다. 데이터베이스 클래스는 다른 사람이 작성했습니다. 내가 바꿀 수 있는지 알게 될거야. 조언 해주셔서 감사합니다! – ethicalhack3r

답변

1

새로운 프로젝트를 시작하는 경우 mysql2 보석을 사용하는 것이 좋습니다. 그것은 이전 버전에 비해 엄청난 개선입니다.

귀하의 예를 들어 루비 -이지는 시도는 다음과 같습니다 전통 @ 변수를 사용

def connect 
    begin 
    if (@dbh) 
     self.disconnect 
    end 

    @dbh = Mysql.real_connect(@server, @user, @pass, @db) 
    puts "[+] Connected to the #{@db} database with user '#{@user}'" 
    rescue Mysql::Error => e 
    # log error 
    end 
end 

이유는 당신이 제대로 인터페이스를 디자인 할 경우 attr_accessor를 사용할 수 있습니다.

싱글 톤 클래스를 사용하여 주위를 난파하는 것보다 싱글 톤 인스턴스를 사용하는 것이 좋습니다. 예를 들어 :

class MyApp 
    def self.db 
    @db ||= Database.new 
    end 

    class Database 
    # Instance methods like initialize, connect, disconnect, etc. 
    end 
end 

당신은이 같은를 사용할 수 있습니다

MyApp.db.connect 

장점을 대신 클래스의 클래스의 인스턴스를 사용하는 직접 한 번에 둘 이상의 연결을 지원할 수있다.

+0

굉장! 조언 감사합니다! – ethicalhack3r

+0

P. mysql2 gem이 훨씬 더 멋지게 보입니다. 구현할 작업이 얼마나 될지 조사 할 것입니다. 다시 한 번 감사드립니다! – ethicalhack3r