You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity连接MariaDB(HeidiSQL管理)超时问题求助

Unity连接MariaDB超时问题的解决办法

问题描述

在Unity项目中采用MariaDB作为数据库、HeidiSQL作为管理界面,编写Database.cs脚本尝试连接数据库并执行插入操作时,出现超时错误:

TimeoutException: The operation has timed out. Rethrow as MySqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. MySql.Data.Common.StreamCreator.GetTcpStream (MySql.Data.MySqlClient.MySqlConnectionStringBuilder settings, MySql.Data.Common.MyNetworkStream& networkStream) (at <13314bc2115d4bd2a5d896df29fb7179>:0)

使用的脚本代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient;

public class Database : MonoBehaviour
{
    private MySqlConnection connection;
    private string server;
    private string database;
    private string user;
    private string password;

    public void Database_Initialize()
    {
        server = "IP-ADDRESS";
        database = "DB_NAME";
        user = "USERNAME";
        password = "PASSWORD";

        string connectionString = "Server=IP-ADDRESS;Port=PORT;Database=DB_NAME;Uid=USERNAME;Pwd=PASSWORD;";
        MySqlConnection connection = new MySqlConnection(connectionString);

        connection.Open();

        string query = "INSERT INTO user (UserName) VALUES ('User1')";
        MySqlCommand command = new(query, connection);

        command.CommandTimeout = 60;

        MySqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            // Access data using reader["columnname"]
        }
        reader.Close();

        connection.Close();
    }
}

注:使用的MySQL.Data.dll取自MySQL官方Connector/NET。


解决办法

1. 验证网络与服务器可达性

  • 确认MariaDB服务器的IP地址、端口(默认3306)填写正确,且服务器处于运行状态
  • 在Unity运行的机器上,通过ping 服务器IP测试网络连通性,用telnet 服务器IP 3306或nc -zv 服务器IP 3306测试端口是否开放
  • 检查MariaDB配置文件(my.cnf/my.ini):确保bind-address设置为0.0.0.0(允许所有IP连接)或指定Unity机器的IP;同时确认服务器防火墙/云安全组已开放3306端口

2. 修正数据库账号权限

  • 确保数据库账号允许从Unity所在机器的IP访问,默认账号通常仅限制localhost连接。可在HeidiSQL中执行以下授权语句:
    GRANT ALL PRIVILEGES ON DB_NAME.* TO 'USERNAME'@'Unity机器IP' IDENTIFIED BY 'PASSWORD';
    FLUSH PRIVILEGES;
    
  • 用HeidiSQL从Unity所在机器远程登录数据库,验证账号是否能正常连接

3. 优化代码与连接字符串

  • 修复变量覆盖问题:原代码中局部变量connection覆盖了类成员变量,修改为使用类的connection字段:
    // 原代码:MySqlConnection connection = new MySqlConnection(connectionString);
    connection = new MySqlConnection(connectionString);
    
  • 优化连接字符串:替换占位符为真实信息,添加连接超时参数延长等待时间:
    string connectionString = "Server=真实IP;Port=3306;Database=真实库名;Uid=真实用户名;Pwd=真实密码;Connection Timeout=120;";
    
  • 调整执行方法:INSERT操作无需使用ExecuteReader(),改用ExecuteNonQuery()更高效:
    // 替换原有的ExecuteReader相关代码
    int affectedRows = command.ExecuteNonQuery();
    Debug.Log($"插入成功,影响行数:{affectedRows}");
    
  • 添加异常捕获:便于定位具体错误,同时确保连接资源释放:
    public void Database_Initialize()
    {
        try
        {
            server = "真实IP";
            database = "真实库名";
            user = "真实用户名";
            password = "真实密码";
    
            string connectionString = "Server=真实IP;Port=3306;Database=真实库名;Uid=真实用户名;Pwd=真实密码;Connection Timeout=120;";
            connection = new MySqlConnection(connectionString);
            connection.Open();
    
            string query = "INSERT INTO user (UserName) VALUES ('User1')";
            MySqlCommand command = new(query, connection);
            command.CommandTimeout = 60;
    
            int affectedRows = command.ExecuteNonQuery();
            Debug.Log($"插入成功,影响行数:{affectedRows}");
        }
        catch (MySqlException ex)
        {
            Debug.LogError($"数据库错误:{ex.Message},错误码:{ex.Number}");
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"其他错误:{ex.Message}");
        }
        finally
        {
            if (connection != null && connection.State == System.Data.ConnectionState.Open)
            {
                connection.Close();
            }
        }
    }
    

4. 确认组件版本兼容性

  • 确保MySQL.Data.dll版本与MariaDB服务器版本兼容(例如MariaDB 10.6对应Connector/NET 8.0+)
  • 将MySQL.Data.dll放置在Unity项目的Assets/Plugins目录下,保证Unity能正确加载该组件

内容的提问来源于stack exchange,提问作者user21302417

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:47:08