代码的功能很简单,启动几个线程,每个线程循环进行sql *** 作,打印输出,如果是只有一个线程的话怎么用都没有问题,但是两个或者超过两个线程就会一直有Datareader被占用的这个错误。可以用下面的代码:
publicpartialclassForm2:Form
{
privateDataBasePoolm_connpool=DataBasePool.getInstance()
privateMySqlConnectionm_conn
privateRandomm_random=newRandom()
publicForm2()
{
InitializeComponent()
}
privatevoidForm2_Load(objectsender,EventArgse)
{
ThreadPool.SetMaxThreads(50,50)
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
for(inti=0i
{
stringtmpStr="【"+i.ToString()+"】"
ThreadPool.QueueUserWorkItem(newWaitCallback(ProcessRun),tmpStr)
//Thread.Sleep(100000)
}
}
privatestaticobjectobj=newobject()
privatevoidProcessRun(ObjectstateInfo)
{
m_conn=m_connpool.getConnection()
inti=m_random.Next(25000)
stringtmpStr=stateInfo.ToString()
while(true)
{
stringsql="selectlocfromtable_ipaddrwhereid='"+i+"'"
MySqlCommandcmd=newMySqlCommand(sql,m_conn)
try
{
strings=cmd.ExecuteScalar().ToString()
Console.WriteLine(tmpStr+"_"+s)
//lock(obj)
//{
//strings=cmd.ExecuteScalar().ToString()
//Console.WriteLine(tmpStr+"_"+s)
//}
//Thread.Sleep(10000)
}
catch(Exceptionex)
{
Console.WriteLine("error!"+ex.Message)
}
//m_connpool.closeConnection(m_conn)
}
}
}
}
NET Core 使用Dapper *** 作MySQL 数据库, .NET Core 使用Dapper。目前官方没有出.NET Core MySQL 驱动,但是已经有第三方进行改动封装出.NET Core MySQL Connector 预览版。
Dapper 也已经出了 .NET Core 预览版。
Dapper dot net 是一个轻量型的ORM,但是性能很强大。
有了.NET Core MySQL Connector 我们可以直接使用ADO.NET *** 作数据库。
目前EF Core 暂时不支持MySQL, 本篇主要讲解使用Dapper *** 作 MySQL。
第三方 MySQL Connector: https://github.com/SapientGuardian/mysql-connector-net-netstandard
Dapper: https://github.com/StackExchange/dapper-dot-net
新建项目
新建一个.NET Core控制台应用程序 NETCoreMySQL
可以参考dapper源码,或者反编译一下dapper.dll,在dapper之上再封装一层拓展方法,正好最近我也在做这个,下面代码可以参考一下:
using Dapper//封装的拓展类
public static class DapperExtension
{
public static int CExecute(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
{
var beginTime = DateTime.Now
return SqlMapper.Execute(cnn, sql, param, transaction, commandTimeout, commandType).ToLog(sql,param, beginTime)
}
public static int CExecute(this IDbConnection cnn, CommandDefinition command)
{
var beginTime = DateTime.Now
return SqlMapper.Execute(cnn, command).ToLog(command.CommandText,command.Parameters,beginTime)
}
……
}
//日志记录拓展方法
private static T ToLog<T>(this T result, string sql, object param, DateTime beginTime, IDbConnection conn =null)
{
//日志记录要异步进行,防止日志记录时报错,影响业务流程
Task.Run(()=> {
var now = DateTime.Now
var log = new LogModel()
{
CreateTime = now,
SqlStr = sql,
ExcuteResult = result.ToJsonString(),
Timespan = (now - beginTime).TotalMilliseconds
}
if (param != null)
{
foreach (var p in param.GetType().GetProperties())
{
log.SqlStr=log.SqlStr.Replace("@"+p.Name,p.GetValue(param).ToString())
}
}
//日志记录到MongoDB中
MongoDbHelper.SetCollection(log, "Log_"+ now.ToString("yyyyMMdd"), "ExcuteLog")
})
return result
} //调用示例:
public int GetInfo(string sql, object param = null)
{
var connStr="...."//数据库连接字符串
using (var conn = new MySqlConnection(connStr))
{
var result = conn.CExecute(sql, param)
return result
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)