web开发,在线人员系统

那天早上 发布于 2012/06/28 16:15
阅读 540
收藏 2
在主页 我每5秒去修改数据库在线状态,去读取是否存在消息 这样不知道好不好?
加载中
0
leo108
leo108
人少可以这么干,人多服务器会跪
那天早上
那天早上
IBM的服务器
那天早上
那天早上
一般服务器吧。8-16G的内存外加 我们简单的项目
leo108
leo108
回复 @孔凡儒 : 看你服务器配置和负载能力咯
那天早上
那天早上
多少算人多?
0
俏文安
俏文安
在线人数为啥要去存数据库?可以维护一个全局的变量,人来+1,人走-1.
俏文安
俏文安
回复 @孔凡儒 : 向你这样频繁访问数据库的行为很没道理的,有些重要数据可以存在数据库,比如购物车什么的。但是在线人数就没必要了吧。你可以把想存储的数据列出来,那些频繁改变的,还是维护一个变量比较方便点。
那天早上
那天早上
不仅仅只存人数啊
0
hchen1982
hchen1982
人员在线状态存数据库不好吧。WEB客户端轮询吧,类似每过5秒一个异步请求,有请求说明在线,超过一定时间没有请求就说明不离线,在线人员可以考虑存放在内存中,根据内存中的在线人员更新在线人员列表。
那天早上
那天早上
不一定存数据库 由其他方式也可以
0
侯林宏
侯林宏
支持二楼的说法。为啥要存到数据库咧。
0
那天早上
那天早上
@红薯 OSC有没有在线人员系统? 那个消息提示 是怎么弄得?
0
墨竹
墨竹
/**
 * 在线用户统计监听器
 * 
 * @author Administrator
 * 
 */
@SuppressWarnings("unchecked")
public class OnlineUserBindingListener implements HttpSessionBindingListener {

OnlineUser onlineUser;

public OnlineUserBindingListener(OnlineUser onlineUser) {
this.onlineUser = onlineUser;
}

public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 把用户放入在线列表

TreeSet<OnlineUser> onlineUserList = (TreeSet<OnlineUser>) application.getAttribute(Const.ONLINE_USER_LIST);
// 第一次使用前,需要初始化
if (onlineUserList == null) {
onlineUserList = new TreeSet<OnlineUser>();
application.setAttribute(Const.ONLINE_USER_LIST, onlineUserList);
}
for (OnlineUser u : onlineUserList) {
if (u.getUuid().equals(onlineUser.getUuid())) {

}
}
for (Iterator<OnlineUser> iterator = onlineUserList.iterator(); iterator.hasNext();) {
OnlineUser u = iterator.next();
if (u.getUuid().equals(onlineUser.getUuid())) {
iterator.remove();
break;
}
}
System.out.println(onlineUser.toString() + " 加入在线用户列表中");
onlineUserList.add(onlineUser);
}

public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();

// 从在线列表中删除用户名
TreeSet<OnlineUser> onlineUserList = (TreeSet<OnlineUser>) application.getAttribute(Const.ONLINE_USER_LIST);
onlineUserList.remove(onlineUser);
System.out.println(onlineUser.toString() + " 从在线用户列表中移除");

}

public static class OnlineUser implements Comparable<OnlineUser> {
private String uuid;

private String username;

private String sex;

private String ip;

private String client;

private Date lastLoginTime;

public String getUuid() {
return uuid;
}

public void setUuid(String uuid) {
this.uuid = uuid;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public Date getLastLoginTime() {
return lastLoginTime;
}

public void setLastLoginTime(Date lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public String getIp() {
return ip;
}

public void setIp(String ip) {
this.ip = ip;
}

public String getClient() {
return client;
}

public void setClient(String client) {
this.client = client;
}

@Override
public String toString() {
return "OnlineUser [uuid=" + uuid + ", username=" + username + ", sex=" + sex + ", ip=" + ip + ", client=" + client + ", lastLoginTime=" + lastLoginTime + "]";
}

@Override
public int compareTo(OnlineUser o) {
return (int) (o.getLastLoginTime().getTime() - this.getLastLoginTime().getTime());
}

}

}

login()方法中
成功后,添加
session.setAttribute(Const.ONLINE_USER_BINDING_LISTENER, new OnlineUserBindingListener(createOnlineUser(user)));


0
zaobao
zaobao
服务器推送,ajax,HTTP长连接,这样避免轮询。存储方面要综合考虑。
0
劳苦大众
劳苦大众
监听servlet 的HttpSessionListener,对created 和 Destroyed进行调用。写一个单例类,存放在线人员数量。然后把你的监听器在web.xml中配置一个 <listener>。用你的session来管理在线人员。
0
Flexer
Flexer

常常变化的信息 放内存

然后服务端推技术

0
lateron
lateron
放到缓存里,比如memcached
返回顶部
顶部