【.net core】【watercloud】数据库连接报错问题

错误信息:

复制代码
中文提示 :  连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:Cannot Open when State is Connecting.DbType="MySql";ConfigId="0".
English Message : Connection open error . Cannot Open when State is Connecting.DbType="MySql";ConfigId="0" 
   at SqlSugar.Check.Exception(Boolean isException, String message, String[] args)
   at SqlSugar.AdoProvider.CheckConnection()
   at SqlSugar.AdoProvider.BeginTran()
   at WaterCloud.Service.AutoJob.JobExecute.<>c__DisplayClass5_0.<<Execute>b__0>d.MoveNext() in E:\WaterCloud\WaterCloud.Service\AutoJob\JobExecute.cs:line 183

导致该问题的原因是连续两次请求或插入更新时,第一操作后,在第二次操作时,第一次的句柄未完全释放,使第二次操作使用该句柄时,句柄还处于链接状态。

解决方案:使用sqlsugar中的.CopyNew()方法,在每次操作时都使用新的数据库链接

在项目文件中修改内容

文件路径:E:\项目路径\WaterCloud.Data\Repository\RepositoryBase.cs

cs 复制代码
/*******************************************************************************
 * Copyright © 2020 WaterCloud.Framework 版权所有
 * Author: WaterCloud
 * Description: WaterCloud快速开发平台
 * Website:
*********************************************************************************/

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using WaterCloud.Code;

namespace WaterCloud.DataBase
{
	/// <summary>
	/// 泛型仓储实现
	/// </summary>
	/// <typeparam name="TEntity"></typeparam>
	public class RepositoryBase<TEntity> where TEntity : class, new()
	{
		// 用于其他表操作
		public ITenant Tenant
		{
			get { return _tenant; }
		}

		private ITenant _tenant;

		private SqlSugarScopeProvider _db;

		public SqlSugarScopeProvider Db
		{
            get { return _db; }
		}

		/// <summary>
		/// 切换上下文,不传参切换到实体租户
		/// </summary>
		/// <param name="configId"></param>
		/// <returns></returns>
		public ISqlSugarClient ChangeEntityDb(object configId = null)
		{
			if (!configId.IsEmpty())
			{
                _db = _tenant.GetConnectionScope(configId);
			}
			else
			{
                _db = _tenant.GetConnectionScopeWithAttr<TEntity>();
			}
			return _db;
		}

		public RepositoryBase(ISqlSugarClient scope)
		{
			_tenant = scope.AsTenant();
            _db = Tenant.GetConnectionScopeWithAttr<TEntity>();
		}

		public async Task<TEntity> Insert(TEntity entity)
		{
			return await _db.Insertable(entity).ExecuteReturnEntityAsync();
		}

		public async Task<int> Insert(List<TEntity> entitys)
		{
			return await _db.CopyNew().Insertable(entitys).ExecuteCommandAsync();
		}

		public async Task<int> Update(TEntity entity)
		{
			return await _db.CopyNew().Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
		}

		public async Task<int> Update(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TEntity>> content)
		{
			return await _db.CopyNew().Updateable(content).Where(predicate).ExecuteCommandAsync();
		}

		public async Task<int> Delete(TEntity entity)
		{
			return await _db.CopyNew().Deleteable(entity).ExecuteCommandAsync();
		}

		public async Task<int> Delete(Expression<Func<TEntity, bool>> predicate)
		{
			return await _db.CopyNew().Deleteable(predicate).ExecuteCommandAsync();
		}

		public async Task<TEntity> FindEntity(object keyValue)
		{
			return await IQueryable().InSingleAsync(keyValue);
		}

		public async Task<TEntity> FindEntity(Expression<Func<TEntity, bool>> predicate)
		{
			return await IQueryable().FirstAsync(predicate);
		}

		public ISugarQueryable<TEntity> IQueryable()
		{
			return _db.CopyNew().Queryable<TEntity>();
		}

		public ISugarQueryable<TEntity> IQueryable(Expression<Func<TEntity, bool>> predicate)
		{
			return IQueryable().Where(predicate);
		}

		public ISugarQueryable<TEntity> IQueryable(string strSql)
		{
			return _db.CopyNew().SqlQueryable<TEntity>(strSql);
		}
	}
}

在对应的增删改查操作中加入.CopyNew()方法

相关推荐
松涛和鸣3 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa3 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k4 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦4 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL5 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·5 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德5 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫5 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i6 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.6 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql