Connection open error 返回
English Message : Connection open error . Authentication to host 'xxx.xxx.xxx.xxx' for user 'xxx' using method 'caching_sha2_password' failed with message: Reading from the stream has failed.
MySQL大并发插入 有时候会报这个错误,请问怎么解决?
热忱回答(23)
-
fate stay night VIP0
2021/9/16提供API 测试用例
0 回复 -
兔子先森 VIP0
2021/9/16public class DaoMysql
{
//数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库.
static readonly string _connstr = ConfigurationManager.ConnectionStrings["mysqlconn"].ConnectionString;
//数据库实例
private readonly SqlSugarScope _db;
/// <summary>
/// 数据库连接
/// </summary>
public DaoMysql()
{
_db = new SqlSugarScope(
new ConnectionConfig()
{
ConnectionString = _connstr,//数据库连接
DbType = DbType.MySql,//数据库类型
//IsAutoCloseConnection = false,//
IsAutoCloseConnection = true,//自动释放数据事务
InitKeyType = InitKeyType.Attribute//从实体特性中读取主键列自增信息
}
);
}
#region 结果集管理
/// <summary>
/// 插入合成数据指标到tb_target
/// </summary>
/// <param name="TaskID"></param>
/// <param name="TaskKey"></param>
/// <param name="paramJson"></param>
/// <returns></returns>
public int InsertTarget(GtTargetModel model,string tablename)
{
return _db.Insertable(model).AS(tablename).ExecuteCommand();
}
#endregion
}
static DaoMysql dao = new();
static void Main(string[] args)
{
List<Task> taskItems = new();
for(int i = 0; i<1000000;i++)
{
Task.Factory.StartNew(() => dao.UpdateServer(mServerModel));
taskItems.Add(Task.Factory.StartNew(() => dao.InsertTarget(GtTargetModel,"tablename")));
}
Task.WaitAll(taskItems.ToArray());
}
大致就是这样
0 回复 -
fate stay night VIP0
2021/9/16@兔子先森: 用法错误
0 回复 -
fate stay night VIP0
2021/9/160 回复 -
fate stay night VIP0
2021/9/16注意点
1、关闭自动释放,使用手动 db.colse释放
2、异步方法 Task.WhenAll
3、db是同一个
4、连接字符串加上 MultipleActiveResultSets=True
5、使用完关闭连接
6、考虑一下你的数据库处理能力
0 回复 -
兔子先森 VIP0
2021/9/16@fate stay night:Mysql 没有MultipleActiveResultSets=True
0 回复 -
fate stay night VIP0
2021/9/16拿我的例子直接去跑,直接复制就行了
0 回复 -
fate stay night VIP0
2021/9/16经过验证 MYSQL Task.WaitAll 执行时间长了就会报你刚才的错误
0 回复 -
fate stay night VIP0
2021/9/16MYSQL.DATA 8.0.26 会比一般版本好些
0 回复 -
fate stay night VIP0
2021/9/16https://blog.csdn.net/luokn1995/article/details/103605870/ 你可以看看相关配置 ,这个性能和SQLSEVER没办法比
0 回复 -
fate stay night VIP0
2021/9/16SQLSERVER正常1000条只要1-2秒, MYSQL时间很长感觉像表锁住一样
0 回复 -
fate stay night VIP0
2021/9/16Task.WaitAll 手动释放模式,目前就 SQLSEREVR 和 SQLITE 达到预期效果, ORACLE 其次,其他都不行
0 回复 -
fate stay night VIP0
2021/9/16你可以换原生方法测试一下
0 回复 -
兔子先森 VIP0
2021/9/16@fate stay night:我用的是mysql8.0.21 像这种是不是没办法彻底解决了呢
0 回复 -
fate stay night VIP0
2021/9/16@兔子先森:你用原生测试看看,像SQLITE SQERVER都秒级的, MYSQL并发请求好像锁表了等待时间就长了 感觉比同步都慢
0 回复 -
fate stay night VIP0
2021/9/16如果用原生ADO也这样可能就需要查些资料了 ,是MYSQL需要配置还是本身这块支持就不好
0 回复 -
兔子先森 VIP0
2021/9/16@fate stay night:我换sqlserver 是不会出现这个问题了吗?
0 回复 -
fate stay night VIP0
2021/9/16@兔子先森: SQLSEVER 1秒并发请求1000 可以处理 我这边测试下来
0 回复 -
兔子先森 VIP0
2021/9/16@fate stay night:好的,我试试
0 回复 -
fate stay night VIP0
2021/9/16@兔子先森:经过测试 SqlSugarCore.MySqlConnector 异步并发性能要比 MYSQL.DATA高很多 基本接近ORACLE ,达到同步请求性能
0 回复 -
fate stay night VIP0
2021/9/16离SQLSEVER和SQLITE差太多
0 回复 -
fate stay night VIP0
2021/9/16我这边是 MYSQL 5.7 的库,你也可以用高版本测试一下,至少我这个低版本 Task When ALL 性能确实不如人意
0 回复 -
兔子先森 VIP0
2021/9/16@fate stay night:好的好的,我试试。谢谢!
0 回复