2
A
回答
3
DBI doc有a chapter about subclassing其中提到了一个不做任何事的$dbh->connected
方法。这似乎正是你想要的。
当正在使用子类的话,后一个成功的新连接,该DBI->连接方法自动调用:
$dbh->connected($dsn, $user, $pass, \%attr);
我还没有试过,但它可能是由刚刚工作的猴子 - 将此连接方法直接修改为DBI而不需要创建任何子类。 In connect
there is definitely a call to connected
。
但我不确定在哪里修补。可能进入驱动程序。快速grep of the cpan显示只有两个司机包括在DBI dist包括这一点。 DBD::Gofer和DBD::Proxy,但那个是空的。它们都在DBD::<drivername>::db
包中。
假设你正在做MySQL,那么你会去挂钩你的驱动程序。可以通过继承和使用该驱动程序,或者通过简单的猴子修补它。
*DBD::mysql::db::connected = sub {
my ($dbh, dsn, $user, $pass, $attr, $old_driver) = @_;
warn 'Connected!';
}
这应该与其他车手一样,除非他们有自己的connected
。在这种情况下,您应该手动包装它或使用Class::Method::Modifiers的around
之类的东西来包装它以确保原始行为保持不变。
此时您还有实际连接的$dbh
,因此如果需要,您可以在数据库中搜索connected
。
当然这会给你回拨后每连接。如果你只想获得重新连接,你可以在一个词汇变量上创建一个闭包,这个变量计算连接并跳过第一个连接。
{
my $connection_counter;
*DBD::mysql::db::connected = sub {
my ($dbh, dsn, $user, $pass, $attr, $old_driver) = @_;
return unless $connection_counter++; # skip first connection
warn 'Connected!';
}
}
请注意,我还没有测试任何这一点。
0
虽然我必须说我没有尝试过;我发现这篇文章
http://justatheory.com/computers/databases/postgresql/execute-on-select.html
其中@theory写到了一个选项,以充分利用DBI每当有事来运行代码 - 就像连接。希望能帮助到你!
相关问题
- 1. perl dbi重新连接断开连接
- 2. 机械化前/后连接挂钩
- 3. AnyEvent :: DBI和数据库重新连接
- 4. Git CHMOD后接收挂钩
- 5. SVN更新后挂钩?
- 6. SocketException:重新连接后重新连接
- 7. Github后接收挂钩在Nodejs
- 8. git后接收挂钩在php
- 9. PR_Write挂钩后
- 10. 如何在定期间隔后重新连接JMS连接器
- 11. c#ChannelFactory:如何在FaultException | TimeoutException之后重新连接/重新打开连接?
- 12. 如何让推送者的信息在接收后挂钩?
- 13. 在moodle注册挂钩后
- 14. 创建后挂钩
- 15. GIT预接挂钩
- 16. 旁路后接收挂钩git
- 17. 提交后挂钩失败可以连接url
- 18. Codeigniter挂钩重新实现我的类
- 19. 更新xprofile字段后的Buddypress挂钩
- 20. 如何挂钩到在Emacs
- 21. SaveChanges成功后如何挂钩操作
- 22. 如何连接量角器js测试与松弛测试后发送挂钩?
- 23. 如何在连接中断后自动重新连接Oracle连接池?
- 24. 如何将svn挂钩连接到已检出的存储库
- 25. 如何挂钩SVN更新与子集
- 26. 如何使用DBI和mod_perl连接DB2?
- 27. 如何在Cherrypy中将工具挂钩到多个挂钩点?
- 28. Django预关机挂钩关闭挂pymongo连接
- 29. 关闭并重新打开后,如何在后台重新连接BLE设备?
- 30. 挂钩或不挂钩 - git
我假设您已阅读文档的[回调部分](https://metacpan.org/pod/DBI#Callbacks)?看起来你可以添加一个回调给任何方法*除了* connect!我所能想到的只是用'patch' DBI :: connect'来调用真正的'connect',然后传递它返回的'$ dbh'。 – Borodin