2017-01-05 8 views
0

だけ異なるパスワードを持つ複数の接続文字列を使用してデータベースに接続しようとしています。パスワードには異なる特権があります。 1つのパスワードが失敗した場合は、別のパスワードを試してください。複数の接続文字列

コードは以下のように書かれています。それはうまく動作しますが、複数の接続文字列を処理するにはどのようにしてコードをリファクタリングできますか(eval & DBH)?

my %config = do 'dbconfig.pl'; 

my $dbh = eval { DBI->connect("dbi:Pg:dbname=".$config{db}.";host=$socket_nm;port=".$config{port}."", $config{user},$config{password},{RaiseError=>1,PrintError=>0}) }; 

if (!$dbh) { 
$dbh = eval { DBI->connect("dbi:Pg:dbname=".$config{db}.";host=$socket_nm;port=".$config{port}."",$config{user},$config{password},{RaiseError=>1,PrintError=>0}) };   
} 

if ([email protected]) { 
#Handle Exceptions 
} 

dbconfig.plは含まれています

db => 'db', 
port => '5432', 
user => 'db_ro', 
password => 'Pass01', 
password2 => 'Pass02' 
+1

あなたは、複数の接続文字列とはどういう意味ですか?それぞれが別のサーバーに接続する複数のハンドルを作成しますか? – simbabque

+0

サーバは同じで、パスワードは特権によって異なります。 – Robie

+0

ユーザーとパスワードが違うので、複数のハンドルが必要ですか?あなたの出力が何であるべきかを指定してください。 – simbabque

答えて

1

あなたは作業接続を取得するまでループを使用して再試行する必要があります。各ループでは、次の設定値を取得して接続する必要があります。

my @configs = (
    { 
     # ... 
     user  => 'user1', 
     password => 'password1', 
    }, 
    { 
     # ... 
     user  => 'user2', 
     password => 'password2', 
    }, 
); 

my $dbh; 
while (not $dbh) { 
    my $config = shift @configs; # grab the next config 
    if (not $config) { 
     # we ran out of configs to try 
     die "Couldn't connect to database"; 
    } 

    # try the config 
    $dbh = eval { 
     DBI->connect(
      "dbi:Pg:dbname=" . $config->{db} . ";host=$socket_nm;port=" . $config->{port} . "", 
      $config->{user}, $config->{password}, { RaiseError => 1, PrintError => 0 }); 
    }; 
    # we don't need to look at [email protected] here, but if we care we can still do it 
} 

configsは今や配列@configsに格納されています。内部には、ハッシュリファレンスがあります。あなたのループでは、字句$configがあります。これには、現在試したいものが含まれています。これはハッシュリファレンスでもあるので、$config->{...}にdsnの矢印を使用する必要があることに注意してください。

我々ループは限り$dbhとして設定されていません。ループ内のevalが作業中のデータベースハンドルオブジェクトを返すまでのケースです。

我々はまた、我々はコンフィグの不足した場合にループを終了する必要があります。死はそれのための良い考えのように思えた。

あなたがしたい場合は、evalがあなたのためにキャッチされたエラーを処理することができますが、これが機能するためにあなたはそれを行う必要はありません。あなたが気にするのは、結局のところ有効な接続が得られれば十分です。


注:%config = do 'dbconfig.pl'は恐ろしいです。 JSONやモジュールなどの適切な設定ファイル形式を使用してください。私は実際にConfig::ZOMGが好きです。さまざまなフォーマットをサポートしており、複数のファイルを1つの設定ハッシュにまと​​めることができます。しかし、ここではConfig::Simpleで十分でしょう。

関連する問題