2016-08-01 4 views
1

다른 연결 드라이버를 사용하는 많은 데이터베이스에 연결하는 Perl 스크립트가 있습니다.모든 데이터베이스 연결 문자열에서 연결을 끊는 방법

마지막으로 단일 연결 끊기 기능을 작성하여 활성 세션이 있으면 연결을 끊을 수있는 방법이 있습니까?

예 :

connection 1: $dbh->oracle; 
connection 2: $dbh->sql 

내가 두 데이터베이스에 대한 일반적인 차단 문자열을 할 수 있습니까?

+3

DBI는 명령문 핸들이 범위를 벗어날 때 암시 적으로 연결을 끊습니다. – simbabque

+0

@simbabque : 나는 다음과 같이 오류가 발생합니다 : 명시 적 disconnect()가없는 DESTROY로 인해 rollback()이 발생합니다 .....이 문제를 방지하기 위해 별도의 연결 해제 함수를 사용하고 있지만 모든 연결 해제 함수를 사용하는 것이 좋습니다. 현. – Husk01inJun

답변

3

visit_handles from DBI을 사용하여 직접 구현할 수 있습니다.

use strict; 
use warnings; 
use DBI; 

my $dbh = DBI->connect('DBI:mysql:database=test;host=localhost', 'root', 'pw'); 
my $dbh2 = DBI->connect('DBI:mysql:database=test;host=localhost', 'root', 'pw'); 

DBI->visit_handles(
    sub { 
     my ($driver_handle, $info) = @_; 

     if ($driver_handle->{Type} eq 'db') { 
      # clean up transaction or simply disconnect for each handle 
      $driver_handle->disconnect; 
     } 

     return 1; 
    } 
); 

visit_handles에 전달 된 코드 참조가 각 드라이버 핸들에 대해 호출됩니다. true 값을 반환하면 동일한 코드 참조로 visit_child_handles이 호출됩니다. 그렇게하면 데이터베이스 핸들 (db)과 일치시킬 수 있고 명시 적으로 연결을 끊을 수 있습니다.

Borodin states in their answer으로 연결을 끊기 전에 반 처리 된 트랜잭션을 처리해야합니다. 이 솔루션은 모든 연결 핸들을 한 곳에서 가져올 수있는 방법을 제공합니다.

+0

니스. 나는'visit_handles'에 대해 몰랐다. 그러나 모든 것에 명시 적으로'disconnect'를 호출하면 펄이 프로그램을 파괴 할 때 암시 적으로 끊어지는 것과 같은 경고가 나오고 열려있는 트랜잭션이있는 모든 핸들에 대해'rollback' 또는'commit'해야합니다. – Borodin

+0

@borodin hmm true. 내 컴퓨터로 돌아 가면 편집 할 것입니다. – simbabque

+0

@Borodin 정보를 알려 주어서 고마워. 나는 오라클, 포스트 그레스, 그리고 MySQL과 같은 다른 드라이버와 연결을 시도하고있다. 이것이 작동 할 것인지 아닌지에 대해 회의적입니다. 내 컴퓨터로 돌아 가면 시도 할 것입니다. – Husk01inJun

2

각 데이터베이스 연결이 별도의 데이터베이스가 $dbh

은 분명히 당신이 연결된 데이터베이스의 목록만큼, 연결된 모든 데이터베이스 핸들에서 연결이 끊어 서브 루틴을 쓸 수 처리로 표시됩니다 항상 동일합니다

왜 연결 문자열을 고정하는지 잘 모르겠습니다. 아마도 DBI->connect을 호출 할 때 사용한 DSN (데이터 소스 이름)을 의미할까요? 그들은 단순히 연결 작업에 매개 변수와 데이터베이스 핸들이 당신이 트랜잭션을 사용하는 것을 의미한다 원래 DSN

Issuing rollback() due to DESTROY without explicit disconnect() 

에서 사후 식별 할 수 없습니다. 가장 좋은 방법은 rollback 또는 commit으로 전화하여 거래를 종료하는 것입니다. 프로그램이 데이터베이스 드라이버

documentation for DBI::disconnect의 기본 동작에 의존로 종료 일반적으로이

을 말할 때 변경 사항이 최선을 다하고 싶은 경우는, 거래를 열린 상태로 나쁜 생각이나 연결을 끊을 때 롤백하면 연결을 끊기 전에 명시 적으로 "커밋"또는 "롤백"을 호출해야합니다.

트랜잭션이 열려있는 동안 당신이 그렇게 commit 또는 rollback 확실히 펄의 파괴 순서가 implcitly 모든 데이터베이스를 분리 수 있도록 괜찮 올바른 방법

입니다 disconnect를 호출하는 경우 또한 같은 경고를 얻을 것이다

트랜잭션이 열려 있지 않은 한 처리합니다.