关于J2ee的几个问题大家讨论一下!

首先说明一下:我得系统是j2ee的struts结构开发的mis系统,数据库访问是调用oracle存储过程,有两个问题我总感觉不对,请各位帮帮忙:
1:如何解决同一用户重复登录的问题,我查了资料,可以用临时表的方式结局,但是必须长期保持会话,请问如何保持这个会话不结束??
2:修改一条记录,现在我是先查许要修改的记录,把此条记录在jsp中显示出来,修改后再提交,可是这样不能避免两个人可以同事修改这条记录啊;
这两个问题都是在mvc结构里面遇到的,请问用mvc结构如何保持 一个会话 在系统访问期间长期存在?? 即可以使 连接数据库的 一个会话,在视图-模型-控制 间传递?

第一个问题可以通过程序代码实现,比如,登陆后可在数据库或缓存加一个标记,然后使用sessionListerner这样的监视者在用户退出登陆时,清除缓存。仅供参考

第二个问题需要使用到事物机制,JTA,也就是可能不只是Struts了,需要struts+EJB Struts+Spring Struts+Jdon等架构。

多谢banq 的解答

是的可以使用session的监听listener,我想这样是可以实现的,我们可以把所有登录的用户名保存在一个ArrayList中,这样可以在用户登录的时候,先判断ArrayList中是否存在此用户名,if 存在则说明已经登录,else 则还没有登录,把用户名存在ArrayList中,按照这样的思路,似乎可以解决重复登录,但是还存在一个问题,那就是如果用户登录后非正常退出即session没有销毁那么用户在session-timeout(系统销毁session的时间)的时间内是不能登录的,session销毁需要调用Session.invalidate();或者是距离上一次收到客户端发送的session id时间间隔超过了session的超时设置,在浏览器关闭时是不能删除session的,从这个角度我们考虑,如果用户关闭浏览器后,session还是存在的,即使用户没有登录,那么用户就要等待很长一段时间才能登录;如何解决这个问题?

1、在网页里边隐藏一个iframe,每隔一段时间就请求一下服务器,同时session失效期设短一些。可以保持浏览器开的情况下session长期有效
2、单纯使用事务并不能解决问题。用户还是可以看到同样的记录并提交不同的修改。考虑在数据库设立标志位,查看到此条记录时标志改成正在查看的状态即可,此方法带来的性能开销比较可观,但在解决某些问题时很有效(比如在线选号)。

“请问用mvc结构如何保持 一个会话 在系统访问期间长期存在?? 即可以使 连接数据库的 一个会话,在视图-模型-控制 间传递? ”
参考spring配置hibernat时 openSessionInView Filter

>单纯使用事务并不能解决问题
这是一种长事物机制,跨段事务,短事务是不能解决的。当然我回答有可能有错,仅作参考啊。

谢谢各位;
不知道各位有没有接触这样得系统,即如何防止重复登录的,和如何修改数据,有没有避免象我说的这种情况;
我测试了中国移动的 网上营业厅 查询话费系统,他们也是使用j2ee开发的,可是他们并没有 实现 阻止重复登录这个功能!

关于重复登录这个问题,我考虑了可以使用session来实现,也可以避免session无法销毁,只是在第二次登录的时候,我们可以提示用户 "已经在别处登录,是否销毁登录信息重新登录?" 如果 用户同意则销毁session并重新 建立session,如果不同意则退出! 不知道这样可以否?给点意见; 不知道 其他系统 如何实现的,望 提供点参考!谢谢

"网页里边隐藏一个iframe,每隔一段时间就请求一下服务器"这很好,AJAX也是使用这种技巧,再结合后台Session管理就可以。

或者你使用数字签名,SSL等也可以。

使用长事务会带来新的问题,比如死锁
我觉得要避免这种写写冲突,要具体问题来具体分析,要避免写写冲突的地方一般是一些实时性较强的数据,如果需要实时性的,建议可以通过AJAX或隐藏桢的方式,不断请求新的数据;如果不要求实时性的话,可以在数据库中做一标志字段之类,在服务器端处理这种写写冲突。

好久没来了,这里来了不少牛人啊!