首页 > 解决方案 > 为什么 SqlConnection.Open() 在 Unity WebGL 应用程序中触发“无法扩大内存数组”错误

问题描述

我有一个非常简单的 Unity WebGL 项目,我试图从中连接到 SQL Server 数据库。

当我在编辑器中运行项目时,它工作正常。

当我运行 WebGL 构建时,一旦我尝试打开数据库连接,就会弹出“内存不足”弹出窗口,并且控制台中出现以下错误:

PrototypeProject.loader.js:1 无法扩大内存数组。(1) 使用 -s TOTAL_MEMORY=X 编译,其中 X 高于当前值 2144141312,(2) 使用 -s ALLOW_MEMORY_GROWTH=1 编译,允许在运行时增加大小,或者 (3) 如果您希望 malloc 返回 NULL ( 0) 用 -s ABORTING_MALLOC=0 编译而不是这个中止

我的理解是错误中包含的建议已过时,因为允许内存增长默认为启用,并且最近版本的 Unity 中没有总内存设置。我不明白为什么(3)会是一件明智的事情

我知道问题是由connection.Open(每次)触发的,因为这些调试行中的第一个是输出但第二个不是

    SqlConnection connection = new SqlConnection(connectionString);     
    Debug.Log("Calling connection.open");
    connection.Open();
    Console.WriteLine("Connection open");

一种选择是停止尝试直接连接到数据库并调用 Web 服务来代替数据库工作。是的,我知道在任何情况下拥有三层架构都是更好的设计——这种方法被用于(失败的,显然)努力快速原型化

但是,我真的很想了解这里发生了什么,以防我将来可能遇到类似的问题。我知道有些东西一定是让你内存不足的临界点,但只是打开一个连接并不直观(但也许我错了......)似乎它应该是一个巨大的内存猪,我可以'在编辑器中使用 Profiler 时看不到任何明显的差异

是否有任何人在排除 WebGL 中的 SQL Server 连接或一般内存问题方面有任何经验,这可能与理解和避免这种行为有关?

标签: sql-serverunity3dout-of-memoryunity-webgl

解决方案


答案比我预期的要简陋得多 - 在 WebGL 构建中使用 SqlConnection 是不可能的,因为 SqlConnection 反过来又试图使用 WebGL 构建无法访问的套接字

究竟为什么这表现为“内存不足”错误,或者为什么 Unity 编辑器不能提供更多帮助并警告您正在使用在开始 WebGL 构建时无法工作的类,我确实这样做了还不明白……


推荐阅读