系统限制连接数量

wilove1985 2010-05-18 04:28:22
我想设置一个C/S系统最多只能500个用户同时连接,该如何实现?
听说可以把数据库连接写成一个组件,在组件上保存X个连接,当每个客户端使用的时候到组件上获取一个连接,直到X个连接都被使用完了就提示无法再连接了,请问这个如何实现啊?谢谢高手了
...全文
122 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
deknight 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wilove1985 的回复:]
那请问一下,如果500个用户同时在线的话,如何才能最大的提高连接系统的速度,连接这么多,SQL系统会不会出问题啊
[/Quote]

sqlserver不会有问题,看机器性能
鸭梨山大帝 2010-05-18
  • 打赏
  • 举报
回复
限制500个用户登录跟SQL连接无光.

每一个用户登陆时判断当前用户数量是否<500,是,则当前用户数量+1,并保存到DB,否则不允许登录,下一个用户登陆时,循环该步骤.
用户登出时,前用户数量-1
(如果仅仅是Client --> DB的架构)

如果有中间层,可以将当前用户数量保存在中间层,其他步骤跟上一个方案一致.
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
那请问一下,如果500个用户同时在线的话,如何才能最大的提高连接系统的速度,连接这么多,SQL系统会不会出问题啊
deknight 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wilove1985 的回复:]
引用 12 楼 deknight 的回复:
放到表的话,我认为不行,比如LZ做了个程序给别人用,总是把当前最大数存到某表某字段
如果我知道了是哪个表哪个字段,我就一直更新它,让它为0,那样我可以无限连接

是啊,所以我才会想知道,有没有什么方法可以写到代码或者组件中去的,或者其他方法可以控制的,最好不要只是把当前连接数写到注册表,INI,txt,XML,数据表这样的方法
[/Quote]
还有个办法,你把数字MD5加密后存进去,然后每次都MD5对照,这样即便他知道是哪个字段,也不好办
但是如果他明白这个字段是将数字MD5后存进去的,那完全可以把0MD5后存进去...
不清楚你具体的需求,我觉得还是直接在代码里判断变量比较好
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 deknight 的回复:]
放到表的话,我认为不行,比如LZ做了个程序给别人用,总是把当前最大数存到某表某字段
如果我知道了是哪个表哪个字段,我就一直更新它,让它为0,那样我可以无限连接
[/Quote]
是啊,所以我才会想知道,有没有什么方法可以写到代码或者组件中去的,或者其他方法可以控制的,最好不要只是把当前连接数写到注册表,INI,txt,XML,数据表这样的方法
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 llddyy123wq 的回复:]
我不是说了吗。写到xml文件中也行,抑或是txt中。
目的就是为了,把这个在线的人数给存到长久的对象中。
[/Quote]
好的,谢谢了,这个方法我记住了
deknight 2010-05-18
  • 打赏
  • 举报
回复
放到表的话,我认为不行,比如LZ做了个程序给别人用,总是把当前最大数存到某表某字段
如果我知道了是哪个表哪个字段,我就一直更新它,让它为0,那样我可以无限连接
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
那有没有什么方法,可以使用代码限定的吗,例如我上面说的,把连接写到一个组件上,让客户端去组件上获取连接,如果客户端断开服务器,则把连接释放回组件上
llddyy123wq 2010-05-18
  • 打赏
  • 举报
回复
我不是说了吗。写到xml文件中也行,抑或是txt中。
目的就是为了,把这个在线的人数给存到长久的对象中。
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 llddyy123wq 的回复:]
每个用户 登录进去时,都需要重新创建一个connection对象。
你这里把这个对象当成是一个公用的。实际情况下不是这样的。当然不行。
[/Quote]
是啊,这个大哥说的对,现在才发现这样不行
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
主要是想解决一下同时在线用户多的问题,如果同时连接数据多,会出现问题
llddyy123wq 2010-05-18
  • 打赏
  • 举报
回复
每个用户 登录进去时,都需要重新创建一个connection对象。
你这里把这个对象当成是一个公用的。实际情况下不是这样的。当然不行。
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
只能把当前连接数量写到表中才可以吗
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data;

namespace ClsC
{
public class SqConPol
{
/// <summary>
/// 建立数据库连接池
/// </summary>
private static List<SqlConnection> CoonPool;
/// <summary>
/// 定义最大连接数
/// </summary>

public static int MaxConCount = 500; //限制最大500
public static int nowConCount = 0;//当前已使用连接的数量

public string driverclassname = "";
public string url = "";
public string username = "";
public string password = "";

public SqConPol()
{
CoonPool = new List<SqlConnection>();

}


/// <summary>
/// 获取连接
/// </summary>
/// <returns></returns>
public SqlConnection getConnection()
{
SqlConnection conn = null;
if (CoonPool == null || CoonPool.Count < MaxConCount)
{
if (nowConCount <= MaxConCount)
{
conn = this.createConnection();
CoonPool.Add(conn);
int lastIndex = CoonPool.Count - 1;
conn = CoonPool[lastIndex];
CoonPool.Remove(conn);
}
}
else
{
if (nowConCount == 0)
{
conn = null;
}
else
{
int lastIndex = CoonPool.Count - 1;
conn = CoonPool[lastIndex];
CoonPool.Remove(conn);
}
}
return conn;
}

/// <summary>
/// 释放数据库连接
/// </summary>
/// <param name="conn"></param>
public void releaseConnection(SqlConnection conn)
{
if (CoonPool.Count == MaxConCount)
{
try
{
conn.Close();
}
catch (SqlException e)
{


}
}
else
{
CoonPool.Add(conn);
}


}


/// <summary>
/// 创建一个数据库连接
/// </summary>
/// <returns></returns>
private SqlConnection createConnection()
{
SqlConnection conn = new SqlConnection();
try
{

conn.ConnectionString = "Data Source=LRP-PC;;user id=sa;password=sa;Initial Catalog=StoneMD;min pool size=4;max pool size=100;packet size=3072;Connect Timeout=100;";
conn.Open();
nowConCount += 1;

}
catch (Exception e)
{

}

return conn;
}

}
}


我创建了一个这样的dll让系统引用,可好像并不能限制打开500个,请问是不是哪里错了
llddyy123wq 2010-05-18
  • 打赏
  • 举报
回复
在数据库中的用户信息表中加一个当前在线状态的字段,登录时改为在线,退出时再改为离线。然后每次有人重新连接前就统计当前在线人数,如果不到500则可以连接,否则不可以连接。
或者把这个状态放到一个xml文件中也行。
捷哥1999 2010-05-18
  • 打赏
  • 举报
回复
定义一个当前连接用户数据表,每次不同的用户连接上来,就新增一条记录。
每次新增前,先select count(*) from 这个表,看看返回的记录个数是否超过500.

当然了,每次用户断开连接,你要同步更新这张表。
wilove1985 2010-05-18
  • 打赏
  • 举报
回复
有 没有具体的代码或示例可以参考一下的啊,谢谢
deknight 2010-05-18
  • 打赏
  • 举报
回复
每连接一个,变量+1 >500时不允许连接

110,524

社区成员

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

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

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