【问题标题】:How to treat Database_Exception with Kohana 3 ORM如何使用 Kohana 3 ORM 处理 Database_Exception
【发布时间】:2012-07-04 17:56:27
【问题描述】:

问题来了

有一个脚本在 X 时间(5 到 40 分钟之间的未知时间)后抛出以下错误:MySQL 服务器已消失,Kohana 变成 Database_Exception 2006因此有些信息没有保存到数据库中。

这是我认为可行的方法

class Model_Bar extends ORM {

protected $_belongs_to = array(
    'foo' => array()
);

public function save(){ //Extends the save method
    try {
        $result = parent::save(); //Try parent save
    }  catch (Database_Exception $e) { //Catch exception
        if ($e->getCode() == 2006) { //If exception code == 2006 then DB has gone away
            mysqli_ping(); //Try to refresh DB link
            $result = parent::save(); //Try parent save again
        } else { //Exception code != 2006
            throw new Exception($e); //Throw new DB exception
        }
    }
    return $result; // Return the result from parent::save()
    }
}

问题:如何刷新 Kohana 的 ORM 中的 DB 链接?

更多信息:

谢谢!

【问题讨论】:

  • 您能否在漫长的过程之后和保存之前重新连接?
  • 不是 ORM 问题 - 这是一个应用程序设计问题。 ORM 并不真正相关。
  • @Petah,这正是我想做的。这就是我扩展保存方法的原因。问题是我找不到办法。
  • @TomTom,我不同意。这是在 Kohana 的 ORM 内部发生的事情,所以我相信它是相关的。但感谢您抽出宝贵时间:)
  • 好吧,你可以不同意所有你想要的 - 我与 BS 2000(大型机)上的人以及 .NET 中的程序员进行的讨论相同 - 处理 db 级别错误不是工具决定,而是申请决定。你重试吗?你传播错误吗?你做什么工作?独立于所使用的技术。例如,我在这里有一个应用程序,其中唯一有效的答案是“在发生损坏之前立即停止应用程序”和“立即触发 WATCHDOG 以关闭打开的操作”。

标签: php mysql kohana kohana-3 kohana-orm


【解决方案1】:

这两者都有问题

  • 已达到 MYSQL 配置的超时时间
  • 超过数据包大小
  • 数据包丢失

如果您正在执行长插入,例如批量插入,如果您的数据库没有为此进行配置,则代码中的任何更改都不会产生任何影响。您可以尝试重新配置您的 MYSQL 实例,然后排除 MYSQL 的责任,然后在您尝试修改代码之后(我怀疑这是问题的根源)。重试保存不会有太大帮助,但会使数据库更加繁忙。

另外,如果您使用的是代理(如 HAProxy),请同时检查其超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多