Laravel - SQLSTATE[HY001] 无法分配足够的内存 - MsSQL

问题描述

我正在使用 MsSql 数据库中的视图对 laravel 中的项目进行第二次连接,我正确配置了 .env 和 config,但是这是内存溢出错误:

$ php artisan tinker
Psy Shell v0.10.5 (PHP 7.3.24-3+ubuntu18.04.1+deb.sury.org+1 — cli) by Justin Hileman
>>> use App\Condinvest\BoletoPropCondominio as BPC
>>> BPC::first();
Illuminate\Database\QueryException with message 'SQLSTATE[HY001] Unable to allocate sufficient memory (meudominio.com.br:5000) (severity 8) (SQL: select top 1 * from [View_Boleto_Prop_Condominio])'
>>> 

已在我的 php.ini 中更改:

memory_limit = 128M

但错误仍在继续。

我的模型大概是这样的:

BaseView.php

<?php
    
namespace App\Condinvest;

use Illuminate\Database\Eloquent\Model;

class BaseView extends Model
{
    protected $connection = 'condinvest';
}

BoletoPropCondominio.php

<?php

namespace App\Condinvest;

class BoletoPropCondominio extends BaseView
{
    protected $table = 'View_Boleto_Prop_Condominio';

    protected $fillable = [
        'Id_Condo_lan',...
        'Id_titular'
    ];
}

当我直接通过命令终端执行相同的查询时:

SELECT TOP 1 * FROM View_Boleto_Prop_Condominio;

成功返回我的数据。

谁能告诉我可能发生了什么,或者我可以如何更好地调试以了解错误所在。

编辑

>>> DB::connection('condinvest')->getConfig()['driver']
=> "sqlsrv"

解决方法

由于错误显然是由数据库进程(而不是 php 进程)报告的,我期望对 php.ini 中的内存限制的更改会产生任何影响。

我发现 this issue 在使用 MSSQL Server 的弃用驱动程序时提到了这个特定错误。 要检查 Laravel 正在使用哪个驱动程序,请在您的 Tinker 控制台中输入 DB::connection()->getConfig()['driver']。如果您看到 sqlsrv,那么这里一切正常,但如果您看到 dblib,那么这可能是错误的根源。这个问题在 Laravel 5.7 中应该是 fixed,如果有多个可用的驱动程序,则更喜欢受支持的驱动程序,但也可能是您的 database.php 配置文件使用了错误的驱动程序。

也有可能实际上超出了数据库服务器或其所在系统的内存限制。能够在命令提示符下运行查询而不出现错误表明情况并非如此,但可能仍然值得研究。如果可用内存非常低,则可能没有足够的内存同时运行 php 和数据库查询。只要数据库进程与您的终端在同一台机器上运行,您就可以通过在终端中运行 free -h 命令来检查可用的系统内存。但是,如果您使用的是共享托管服务提供商,那么数据库可能位于单独的机器上。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...