我想这个也可以通过在数据库里,user表里加一个字段来实现吧,通过一个ID登录的时候要到数据库里去读相关数据,这时可以读出他现在的登录状况

解决方案 »

  1.   

    楼上两位我要做的系统可能有10w用户的点击率,所以不太想增加数据的负担
    另外,利用session的好处,是因为session在用户退出后,相应的ID会自动消失,这们用数据库可能还比较麻烦,因为需要知道用户是否已经退出登录!
      

  2.   

    用session也解决不了用户非正常退出问题
      

  3.   

    楼主的方法可能还不如放入数据库来作更具有效率。
    只需要在查询时添加:
    在user表中添加字段,例如loged,
    where userID="" and password="" and loged=""
    登陆成功之后,就改变loged的状态。
    拥有10万的系统访问量,从session(hashtable)中,查找一个记录的效率肯定不会高,
    只有数据库能负担这种访问量
      

  4.   

    楼上,我不能确定这些用户信息是放在内存中快,还是查数据库来的快
    我想是不是可以将用户登录信息放在内存中的hashtable中,因为对数据库的一次操作应该是对内存操作的10速以上!
      

  5.   

    放内存里是一定的,系统启动时先制一张空表在内存里有用户登陆时插入一条用户数据表示登陆退出监测可能要利用一下 session (不是很熟,提个想法!)把登陆状态直接存到数据库里速度慢,而且逻辑上就错了登陆状态只是暂时的,没必要保存到数据库里
      

  6.   

    还是建议放数据库中,如果楼主一定要放
    到session中管理,用session事件监听,可以参考下面的贴子
    http://www.csdn.net/develop/Read_Article.asp?Id=15653
      

  7.   

    放到内存中,会占用很多内存,从用户登陆一致到用户退出
    这些信息都要保留在内存当中。Web设计有一个原则,就是尽量少
    用session变量,如果非得用不成,也尽量用“小的对象”。由于
    session用起来比较方便,很容易造成滥用。
    而相应的一个取代方法,就是放入“持久资源"中,其中数据库就是
    上佳选择。
    我认为可以将是否登陆(is online)看成是用户的一个属性,
    放入数据库也是理所当然的。
      

  8.   

    谢谢两位精辟详尽的讲解目前我已经采用session的方法,原因:
    1、对数据库过多的操作将导致数据库负担过重,10w用户的点击不是一般的量,并且不是一个用户只进行一次数据库操作,包括用户的进入,退出等都需要查询、插入、更新相应字段
    2、用session本身已经的机制,可以很好的控制用户退出,也就是session-timeout,并且session本身的操作很方便
    3、对原来的代码不需要做太多的改动,只要在用户成功登录的地方session.setAttribute(),再写一个UserSession类就可以了,层次很清楚采用方法:
    HttpBindingLister未解决问题:
    1、用户非正常退出,比如拔网线、电源等,没有一个好的标准检测
    2、如果用户在session-timeout时间之内进出,无法判断,目前只做到将冲突的用户IP写入日志,但实际可能并不是冲突。
      

  9.   

    sorryHttpBindingLister --> HttpSessionBindingLister
      

  10.   

    放到内存里 != 滥用session != 浪费内存只是一个用户名(或登陆序号)与登陆状态的 键/值对键是 String  值是 Boolean  而且更具我上面说的方法,用户登陆时才插入 一个键/值对这样的话甚至可以省略 Boolean 值10w用户点击率,如果每个用户 登陆/退出 都要修改数据库可以想象这个速度一定很惊人!况且,数据库还要做其他的数据操作还有,登陆状态是暂时的量,如果保存到数据库,而且还要考虑系统崩溃的情况,那每次系统启动都得还原每个用户的登陆状态就算 10w 用户都登陆, 10w 个 8~16字节的 String 对象占多少内存??Web 服务器一般有多少内存?? 如果真的不够,添一条内存可以提升速度,剩下麻烦的话……
      

  11.   

    其实,内存的占用是一方面(String类型有4个int型变量和一个char[]变量,按字符串长度为5计算的话,可以占用:100K*(6×4+5)=2.9M,然后Boolean值中只有一个boolean型变量,也就是100K*4=400K,总共也就是3.3M吧,硬件虽然便宜,但是加32M的内存不一定就能弥补那3.3M的差别,我想这点大家都清楚),检索速度是另一方面。HashMap的检索速度跟数据库比较,不知道大家比较过没有?其中的速度差别有多大。
    既然楼主已经用session管理的方式来管理,就试着回答楼主的两个问题吧:
    非正常退出,如果只允许一个用户在线的化。用户可能只能等到那个session过期了,用户才能再次登陆。如果同时允许同一个id登陆的化,当然只需要记录日志就可以了,但这并不能反映实际情况,用户可能并没有在两个地方登陆。也正是楼主所说的“实际可能并不是冲突”“没有一个好的标准检测“。