【问题标题】:How to prevent SQLITE SQLSTATE[HY000] [14]?如何防止 SQLITE SQLSTATE[HY000] [14]?
【发布时间】:2014-10-29 08:40:03
【问题描述】:

我有时会收到以下错误:

SQLSTATE[HY000] [14] 无法打开数据库文件

我使用

打开数据库
new PDO("sqlite:database/datbase.db","","",array(
    PDO::ATTR_PERSISTENT => true
));

每次我想从数据库读取数据或向数据库写入数据时。打开的进程是如下函数:

function opendatabase(){
try{
    return new PDO("sqlite:database/database.db","","",array(
        PDO::ATTR_PERSISTENT => true
    ));
}catch(PDOException $e){
    logerror($e->getMessage(), "opendatabase");
    print "Error in openhrsedb ".$e->getMessage();
}
}

一段时间后(有时超过一个小时,有时几分钟后,我在帖子开头收到错误消息。如何防止此类错误?

【问题讨论】:

  • 一定要使用持久连接吗?

标签: php pdo sqlite persistent


【解决方案1】:

这是来自 SQLlite 的错误:

#define SQLITE_CANTOPEN 14 /* Unable to open the database file */

你好像打开了很多连接,建议你重用打开的连接。

创建属性:

private $pdo;

并在创建新对象之前检查它是否为空:

function opendatabase(){
    try{
        if($this->pdo==null){
          $this->pdo =new PDO("sqlite:database/database.db","","",array(
                PDO::ATTR_PERSISTENT => true
            ));
        }
        return $this->pdo;
    }catch(PDOException $e){
        logerror($e->getMessage(), "opendatabase");
        print "Error in openhrsedb ".$e->getMessage();
    }
}

【讨论】:

    【解决方案2】:

    如果有人在重用 PDO 连接时收到相同的消息但仍然存在问题,这可能是因为您正在存储从 fopen() 获得的图像而忘记了 fclose() 语句。在这种特殊情况下,错误消息确实具有误导性。 这是我在几天的故障排除后设法解决的相同错误消息的问题。 SQLSTATE[HY000] [14] : can't open database because too many connections are already opened

    【讨论】:

      【解决方案3】:

      很奇怪,但对我来说这是因为没有将新的 PDO 语句包装在 try/catch 块中。

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 2018-10-13
        • 2021-09-03
        • 2019-04-13
        • 2013-09-22
        • 1970-01-01
        • 2018-07-23
        • 2016-06-27
        • 2020-10-13
        相关资源
        最近更新 更多