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
相关产品推荐
相关产品推荐

