C# mysql连接的问题

示申○言舌 2017-10-30 09:39:49
最近研究服务端,想问一个问题。开发高并发服务端时,C#应用mysq,需要不需要实现mysql连接池?就是我事先准备好一些mysql连接,然后在使用的时候,从这些连接中找出一个未使用的,然后进行mysql操作。完了事将连接放回池子(但不挂断连接)。这样做有必要吗???还是mysql本身就已经提供好了连接池,不需要再这么做了??

我写了个mysql连接池的类如下:
public class MySqlConnectors
{
private MySqlConnection[] m_connectors;
AutoResetEvent[] m_waitHandlers;

public MySqlConnectors( string usr, string pwd, string db, string ip, ushort port = 3306, int maxConnectors = 16 )
{
m_waitHandlers = new AutoResetEvent[maxConnectors];
m_connectors = new MySqlConnection[maxConnectors];

string constr = string.Concat(new object[] {
"data source=", ip,
";port=", port.ToString(),
";user id=", usr,
";password=", pwd,
";database=", db
});
for (int i = 0; i < maxConnectors; ++i)
{
m_waitHandlers[i] = new AutoResetEvent(true);
m_connectors[i] = new MySqlConnection(constr);
m_connectors[i].Open();
}
}

~MySqlConnectors()
{
for (int i = 0; i < m_connectors.Length; ++i)
{
m_waitHandlers[i].Close();
m_connectors[i].Close();
}
Log.show("Mysql connector shutdown...");
}

public MySqlConnection GetConnector( out int index )
{
index = WaitHandle.WaitAny(m_waitHandlers);
return m_connectors[index];
}

public void Release( int index )
{
m_waitHandlers[index].Set();
}


请大神制定一下这样做有没有必要。。。还有一个问题,就是下面这个,Thread_COnnected不知道是个啥,百度了一下说是当前接入的客户端数量。但是我的服务端进程已经关掉了,这个数却不降低。。。

mysql> show status like '%th%';
+------------------------------------------+-------+
| Variable_name | Value |
+------------------------------------------+-------+
| Delayed_insert_threads | 0 |
| Slow_launch_threads | 0 |
| Ssl_ctx_verify_depth | 0 |
| Ssl_verify_depth | 0 |
| Threads_cached | 9 |
| Threads_connected | 1 |
| Threads_created | 33 | //这个东东不知道是啥。只增不减。。。开一个进程就增加32个,关了进程也不降低
| Threads_running | 1 |
+------------------------------------------+-------+
10 rows in set (0.00 sec)
...全文
380 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2017-11-01
  • 打赏
  • 举报
回复
他的 Threads_cached = 6(缓存) 所以才会 Threads_created = 7 访问不是太频繁时,足以应付了 如果你觉得 Threads_created 太高,可以适当增加 Threads_cached
示申○言舌 2017-11-01
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
你不是说,明白的吗?怎么又不理解了呢?
Threads_created MySQL服务自启动以来曾经建立过的线程数
跟应用程序有什么关系?

这位版主先生。。。。哎。。。
谢谢您的回答。。不过我觉得您并没有去对比过这个参数。
我从一台运行了1年的正常的服务器上看到的这个数的值,当然中间服务器有过重启。。mysql也有过服务重启。但这个服务器的访问量还是很大的。这个数值是7。。只有7而已。。截图为证:

我的意思是。我每次运行我的程序,这个数值就会增加32,而且当我关闭程序时,这个数值并没有减少。这就是说这个数值是一直累加的,就想uptime一样。。当然我不知道我的推测对不对,所以才问的。。但是如果按照您的说法,那台服务器上只建立了7个线程而已。。显然这个参数的真实意义跟我推测的不太一致。所以才有这个帖子的问题。。您要是知道,就说说它的意义。您要是不知道,就不要反问人家懂不懂线程什么的了。
示申○言舌 2017-11-01
  • 打赏
  • 举报
回复
引用 8 楼 From_TaiWan 的回复:
在mssql里面,连接池是系统自有的,无需你控制;当connection 执行open()时,系统从连接池中分配一个未用的连接…… mysql应该类似吧
谢谢您的回答。。。执行open的时候耗费的性能可以忽略么?如果我事先弄好n个链接,都open开,以后用就不open了,跟每次用都去open一下性能差距大不大。。。 再次谢谢您。。。
秋的红果实 2017-11-01
  • 打赏
  • 举报
回复
在mssql里面,连接池是系统自有的,无需你控制;当connection 执行open()时,系统从连接池中分配一个未用的连接…… mysql应该类似吧 第二个问题,可能存在延迟问题,刷新下sql服务器,在执行这个查询,应该就是0了;还可能是有另外的连接
xuzuning 2017-11-01
  • 打赏
  • 举报
回复
曾经建立过的线程数 不知道什么是线程?
示申○言舌 2017-11-01
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
你不是说,明白的吗?怎么又不理解了呢? Threads_created MySQL服务自启动以来曾经建立过的线程数 跟应用程序有什么关系?
你是说,只要建立过连接他就算上。。断开之后重新连接的链接,也算是新建立的连接??所以它只增不减???
秋的红果实 2017-11-01
  • 打赏
  • 举报
回复
引用 9 楼 sdhexu 的回复:
[quote=引用 8 楼 From_TaiWan 的回复:] 在mssql里面,连接池是系统自有的,无需你控制;当connection 执行open()时,系统从连接池中分配一个未用的连接…… mysql应该类似吧
谢谢您的回答。。。执行open的时候耗费的性能可以忽略么?如果我事先弄好n个链接,都open开,以后用就不open了,跟每次用都去open一下性能差距大不大。。。 再次谢谢您。。。 [/quote]执行open消耗的性能很小。一般不要事先建立多个连接,要知道connection是非托管资源,不受GC管理,即使一个connection,最好是用完及时close,用时再打开,以减少占用资源 连接池里对连接的管理,是sqlserver自己执行的,无需在程序里考虑
xuzuning 2017-10-31
  • 打赏
  • 举报
回复
Threads_created 曾经建立过的线程数 hreads_connected 已经建立的连接数
xdashewan 2017-10-31
  • 打赏
  • 举报
回复
这你可能要去查阅MySqlConnection的文档,SqlConnection是本身实现了连接池的,MySqlConnection用的少不清楚
xuzuning 2017-10-31
  • 打赏
  • 举报
回复
你不是说,明白的吗?怎么又不理解了呢? Threads_created MySQL服务自启动以来曾经建立过的线程数 跟应用程序有什么关系?
示申○言舌 2017-10-31
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
Threads_created 曾经建立过的线程数 hreads_connected 已经建立的连接数
字面意思我明白,但是我发现Thread_created只增长不减少,我的程序都关了,他还是那个数。。但是当程序重新打开,他的数会增加。
示申○言舌 2017-10-31
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
这你可能要去查阅MySqlConnection的文档,SqlConnection是本身实现了连接池的,MySqlConnection用的少不清楚
大神,c#连接mysql都用啥??不用Mysql.data.Connector的话。。。 你意思是他本身实现了连接池,我这么弄其实没啥效果么?? 但是我想,如果每次我操作数据库都得先连接再操作,比如这样: conn = new MySqlConnection("source=localhost;port==3306;user=root;password=123456;"); conn.open(); 这个new和open难道不消耗性能么?mysql会直接从池子里返回一个连接?

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧