似乎我的代码需要很长时间才能打开一个连接,我已经运行了一些测试,并且它花费的时间太长,之前它将以500ms的最大速度加载。
这个时间在2秒内达到峰值,这是在C#中打开MySQL连接的正常行为,还是我的概念正确?我用秒表判断这个时间非常准确。
让我们对它进行基准测试......
Startup 1 took: 1777ms
Startup 2 took: 1817ms
Startup 3 took: 1796ms
Startup 4 took: 1673ms
Startup 5 took: 1905ms
Startup 6 took: 1716ms
这是瓶颈的开始......
public DatabaseConnection Connection => new DatabaseConnection(_connectionString);
public bool ConnectionWorks()
{
try
{
using (Connection)
{
}
return true;
}
catch (Exception)
{
return false;
}
}
对于对DatabaseConnection类的构造函数感兴趣的人,这里是。
public DatabaseConnection(string connectionString)
{
_connection = new MySqlConnection(connectionString);
_command = _connection.CreateCommand();
OpenConnection();
}
OpenConnection()方法:
private void OpenConnection()
{
if (_connection.State == ConnectionState.Open)
{
throw new InvalidOperationException("Connection already open.");
}
_connection.Open();
}
连接字符串:
var connectionString = new MySqlConnectionStringBuilder
{
ConnectionLifeTime = 60 * 5,
ConnectionTimeout = 30,
Database = "testing",
DefaultCommandTimeout = 30,
Logging = false,
MaximumPoolSize = 250,
MinimumPoolSize = 10,
Password = "********",
Pooling = true,
Port = 3306,
Server = "127.0.0.1"
UserID = "root"
};
我做了一些调试,可以看到瓶颈来自_connection.Open()
,第一个之后的所有连接都在20ms内完成,这比第一次连接要快得多......
答案 0 :(得分:2)
Oracle的Connector / NET提供程序有一个known bug #80030,可以很快地与服务器建立第一个连接。
我建议切换到MySqlConnector,这是修复此错误的OSS替代方案,整体性能更高,并提供真正的异步I / O.
答案 1 :(得分:0)
显然,你的硬件与任何通话的性能都非常相关,所以通话需要多长时间,这是一个毫无意义的问题。
建立数据库连接通常是一个缓慢的过程,这就是连接池和连接重用是一种常见技术的原因。
分析,而不是秒表,可以让您更好地了解瓶颈。