У меня мохолитичное приложение, структурированное так:
/root_dir/lib/Mojo_App/Controller/Main.pm
/root_dir/lib/Mojo_App/Database/Db.pm
/root_dir/ ...
В базе данных :: Db у меня есть подпрограмма, которая создает соединение с SQL SERVER.Эта подпрограмма экспортируется и используется в Main.pm
Пример:
База данных :: DB
my $config = {
db1 => {
host => 'dbi:Driver:server=ip01;database=db01',
user => 'user01',
pass => 'pass01'
},
db2 => {
host => 'dbi:Driver:server=ip02;database=db02',
user => 'user02',
pass => 'pass02'
},
db3 => {
host => 'dbi:Driver:server=ip03;database=db03',
user => 'user03',
pass => 'pass03'
}
};
sub connect_db {
use DBI;
my $self = shift;
return 0 unless $self;
my $dbh;
if (exists($config->{$self})) {
return $dbh = DBI->connect($config->{$self}->{host}, $config->{$self}->{user}, $config->{$self}->{pass}) || die( $DBI::errstr . "\n" ) ;
} else {
return "Connection not in config. \n" ;
}
return $dbh;
}
В Main.pm я подключаюсь так:
my $dbh = connect_db('db1');
Теперь допустим, что мне нужно подключиться к базе данных на странице индекса, поэтому в Main.pm у меня будет индекс подпрограммы, подобный следующему:
sub index {
my $self = shift;
my $dbh = connect_db('db1');
...
$self->render();
}
Теперь я не хочу, чтобы каждый раз, когда пользователь обращался к странице индексаЧтобы установить новое соединение, я хочу проверить, является ли соединение живым, а если нет, создать его.
Я читал о методе ping, но я не знаю, как я могу реализовать это здесь.Также я прочитал о DBIx и попробовал следующую реализацию:
sub connect_db {
use DBIx::Connector;
my $self = shift;
return 0 unless $self;
my $dbh;
if (exists($config->{$self})) {
my $conn = DBIx::Connector->new($config->{$self}->{host}, $config->{$self}->{user}, $config->{$self}->{pass}, {
RaiseError => 1,
AutoCommit => 1,
});
return $dbh = $conn->dbh; ;
} else {
return "Connection not in config. \n" ;
}
return $dbh;
}
Достигнет ли эта реализация того, чего я хочу?Когда соединение с базой данных активно для использования и не воссоздано.Если да, безопасно ли использовать DBIx как Dbi?Я имею в виду здесь:
my $dbh = $conn->dbh;
$dbh->do('INSERT INTO foo (name) VALUES (?)', undef, 'Fred' );
and not
$conn->run(fixup => sub {
$_->do('INSERT INTO foo (name) VALUES (?)', undef, 'Fred' );
});
Спасибо