我想设置一个C/S系统最多只能500个用户同时连接,该如何实现?
听说可以把数据库连接写成一个组件,在组件上保存X个连接,当每个客户端使用的时候到组件上获取一个连接,直到X个连接都被使用完了就提示无法再连接了,请问这个如何实现啊?谢谢高手了

解决方案 »

  1.   

    定义一个当前连接用户数据表,每次不同的用户连接上来,就新增一条记录。
    每次新增前,先select count(*) from 这个表,看看返回的记录个数是否超过500.当然了,每次用户断开连接,你要同步更新这张表。
      

  2.   

    在数据库中的用户信息表中加一个当前在线状态的字段,登录时改为在线,退出时再改为离线。然后每次有人重新连接前就统计当前在线人数,如果不到500则可以连接,否则不可以连接。
    或者把这个状态放到一个xml文件中也行。
      

  3.   

    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个,请问是不是哪里错了
      

  4.   

    每个用户 登录进去时,都需要重新创建一个connection对象。
    你这里把这个对象当成是一个公用的。实际情况下不是这样的。当然不行。
      

  5.   

    我不是说了吗。写到xml文件中也行,抑或是txt中。
    目的就是为了,把这个在线的人数给存到长久的对象中。
      

  6.   

    是啊,所以我才会想知道,有没有什么方法可以写到代码或者组件中去的,或者其他方法可以控制的,最好不要只是把当前连接数写到注册表,INI,txt,XML,数据表这样的方法
      

  7.   

    还有个办法,你把数字MD5加密后存进去,然后每次都MD5对照,这样即便他知道是哪个字段,也不好办
    但是如果他明白这个字段是将数字MD5后存进去的,那完全可以把0MD5后存进去...
    不清楚你具体的需求,我觉得还是直接在代码里判断变量比较好
      

  8.   

    那请问一下,如果500个用户同时在线的话,如何才能最大的提高连接系统的速度,连接这么多,SQL系统会不会出问题啊
      

  9.   

    限制500个用户登录跟SQL连接无光.每一个用户登陆时判断当前用户数量是否<500,是,则当前用户数量+1,并保存到DB,否则不允许登录,下一个用户登陆时,循环该步骤.
    用户登出时,前用户数量-1
    (如果仅仅是Client --> DB的架构)如果有中间层,可以将当前用户数量保存在中间层,其他步骤跟上一个方案一致.
      

  10.   


    sqlserver不会有问题,看机器性能