`
joewalker
  • 浏览: 209807 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

做投票系统的经验

阅读更多

      写这篇经验之前,先总结下做这个系统出现的一些问题:

      忽现Unicode编码、票数清零、服务器当机、内存溢出、多线程处理文件造成文件错误更新、没有控制好用户狂刷、最囧的是,IO流没有close掉......


      在公司刚换了个项目组,接手了一个投票系统的任务,参于被投票的对象是一批经过多次评选的经纪人(一共60人),谁得票最高即可获得丰厚奖品的。

      投票的规则以每个IP每天最多可以投50票,投票者抓住这个规则之后,一直疯狂的刷点...

      我们开始把投票结果记录到.properties里面,也许因为刷点的原因,出现了莫名其妙的\u0000空格Unicode错误编码,造成对配置文件解析错误。严重的情况是,有某些参赛者的票数突然清零,狂飙冷汗,有不少的参赛者打电话来投诉(糟了,要被开除了...)看了下配置文件,还是一些无缘无故出现Unicode编码。

      原来做了几个投票页,1个IP只能投1票,所以很少同步操作的情况。但现在不同了,于是放弃.properties,改成xml,.properties最大的问题是更新后会引起顺序混乱,不好管理,而xml解决了这个问题,对于编码问题也容易处理。最重要数据被清零的问题也解决了。

<vote>
  <members>
    <member id="1" count="12839"></member>
    <member id="2" count="4550"></member>
    <member id="3" count="245"></member>
    <member id="4" count="20"></member>
    <member id="5" count="39"></member>

    ....
  </members>
  <dates>
    <date id="20090611">
        <ip addr="192.168.16.38" count="6"></ip>

        ....
    </date>

    ....
  </dates>
</vote>

      P.S.:这次新学了JDOM,用它来解析XML真的很方便,有兴趣可以学习一下。  http://www.ibm.com/developerworks/cn/java/j-jdom/index.html

      为了收集参赛者被投票的信息,在投票中加入了一个记录投票数据的xml,结构如下:

<vote>
  <members>
    <member id="1" name="张三" count="3">
      <ip addr="192.168.16.38" startTime="09:37:35" endTime="09:37:39" count="3"></ip>

      ....
    </member>

    ....
  </members>
  <ips>
    <ip addr="192.168.16.38" startTime="09:37:35" endTime="09:37:39" count="3">
      <info voteId="1" voteTime="09:37:35"></info>

      <info voteId="1" voteTime="09:37:37"></info>
      <info voteId="1" voteTime="09:37:39"></info>

      ....

    </ip>

    ....
  </ips>
</vote>


    这个投票详细记录的方法我们选择在晚上更新,但是更新之前服务器突然挂掉了,不知道什么原因,这个新的生成xml的方法更新以后,服务器挂掉的频率更高了,后来查看内存,一直狂涨,这下子就囧了。。。肯定是流忘记关闭了。然后回忆xml更新的一句代码,这是JDOM封装的保存更新xml的方法。代码如下:

public void updateXml(Document doc, String xmlUrl) {
   Format format = Format.getPrettyFormat();
   format.setEncoding("UTF-8");
   format.setExpandEmptyElements(true);
   XMLOutputter printDoc = new XMLOutputter();
   printDoc.setFormat(format);
   try {
    
printDoc.output(doc, new FileOutputStream(xmlUrl));
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
 }


里面有个 new FileOutputStream(xmlUrl), 问题就出在这里了,压力测试时没注意好内存的变化,于是重新初始化一个FileOutputStream对象,结束时关掉。

修改后,代码如下:

 public void updateXml(Document doc, String xmlUrl) {
   FileOutputStream out = null;
   Format format = Format.getPrettyFormat();
   format.setEncoding("UTF-8");
   format.setExpandEmptyElements(true);
   XMLOutputter printDoc = new XMLOutputter();
   printDoc.setFormat(format);
   try {
    
out = new FileOutputStream(xmlUrl);
    printDoc.output(doc, out);

   } catch (FileNotFoundException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
finally {
    try {
     out.flush();
     out.close();
    } catch (IOException e) {
     e.printStackTrace();
    }

 }

       哎,真失败吖。。搞了两年程序出了这样一个失误。。悲哀吖。。问题还是没有完全解决,投票的人还是一直狂点狂刷,于是在页面加了这样段很简单的脚本,限制了投票人的疯狂操作。js代码如下:

var num = 0;
var oId = "";
function toVote(id){
    oId = id;
    
if(num == 5) {
        alert("很抱歉,您投票的频率太快,请稍后再试。");
        return;
   }
   if(num!=1){
       num = 1;
       createxmlHttpuest("update.jsp?id="+id+"&time"+new Date());
      
num = 5;
       fangshua();
   } else {
       alert("正在投票中,请稍后");
   }
}

 
function fangshua() {
    window.setTimeout(function(){num = 0;} ,5000);
}

    红色部分就是新加进去的防刷脚本,虽然简单,但是很实用。

    但是为了避免刷票而控制程序问题,还是治标不治本,于是在调用更新票数的方法上加上同步锁,避免多线程引起的错误。代码如下:

Object obj = new Object();
....
synchronized (obj) {

    String cTime = xml.CurrentlyTimes("yyyyMMdd");
    try {
        content = xml.getVoteUpdate(id, cTime, ip);             
    } catch (Exception e) {
        content = null;
    }
    if (content.equals("ok")) {
        xml.statVote(ip, id);
    }

}

 

   对更新的方法经过压力测试,50个同步线程执行,统计的xml与详细记录的xml文件更新也不会出现多线程写入的错误。但是还有一个细节,处理一个文件,建议单独使用一个File对象,避免出现引用错误。

 

File file = new File(this.statVoteXmlURL);    
Document newDoc = null;
SAXBuilder sb = new SAXBuilder();
sb.setIgnoringElementContentWhitespace(true);     
if (file.exists()) {
    sb.setIgnoringElementContentWhitespace(true);
    try {
        newDoc = sb.build(file);
    } catch(Exception e) {
        e.printStackTrace();
        return ;
    }
....

 

   总结一下之前做投票系统需要注意的问题:

   1、一定要做防刷分脚本.

   2、频繁被调用的方法要做同步,做多线程压力测试.

   3、处理文本的对象要单独初始化,避免引用冲突.

   4、使用xml记录数据比使用文本记录要好.

   5、流对象不能单独在参数中实例化,不然会很囧...它不会自己关掉的,必须手动关掉.

 


3
1
分享到:
评论
3 楼 printfabcd 2011-12-24  
挺好的,不过如果对压力比较大的情况下,用xml存储的话,肯定是扛不住的,不过防刷这个挺不错的,学习了function fangshua() {
    window.setTimeout(function(){num = 0;} ,5000);
}
2 楼 joewalker 2009-09-23  
hemin108 写道
就是被投票者的信息(票数)都存在在xml文件么?还想问下如果我们采用将数据存储在数据库要注意什么问题?


    恩,都是保存在xml里面,至于结构可以按照投票项目的形式去设置。除非投票的信息需要长期保存,数据对日后有帮助,才考虑保存到数据库,短期就无所谓了,哪个都一样。
    其实不管是保存在数据库也好还是xml也好,一定要控制好防止用户刷分的情况出现,对update的方法进行同步,可以的话做下多线程的测试,避免出现死锁、或者写文件错误(用xml的时候)。其实投票系统需要注意的地方,我上面都已经全部说明了,只要控制好以上几点,就OK了。
1 楼 hemin108 2009-09-19  
嗯学习了 最近正要写一个投票系统,还没下手,看到楼主的帖子,学到了些知识,但还有些问题想请教,就是被投票者的信息(票数)都存在在xml文件么?还想问下如果我们采用将数据存储在数据库要注意什么问题?

相关推荐

    jsp 投票系统介绍

    数飞网络投票评选管理系统包括投票后台管理、投票网站...用户登录数飞尔官方网下载专区下载最新的投票系统,解压后启动即可免费试用,用户在使用过程中对系统某功能操作有疑问,可向数飞尔工作人员咨询或索取相关资料。

    毕业设计 微信小程序 在线投票系统

    主要实现业务: 用户投票,可附加一张图片,投票详情显示投票选项的比例及投票用户,非匿名投票可查看用户投票详情,投票结束时间到了,标记为投票结束(自动).用户可查看自己发起的投票和参与的投票,对于自己的...

    仙人掌网络人物投票系统 v2.0.rar

    仙人掌网络评选投票系统经过两年多的开发,为全国多家媒体、政府机构、地区门户网站提供了网上评选投票活动解决方案,我们汲取了宝贵的实际运营经验。拥有最为强大的投票防作弊系统来防止刷票作弊。 完善的售后服务...

    JSP+servlet+javabean投票系统

    这是我的一个小练习 用JSP,SERVLET,JAVABEAN技术,JDK1.6+MYSQL+...想做一个比较好的MVC模式的投票系统,实战经验少啊,遇到了各种问题,不过还是把它最基本的实现了 没有很好用MVC模式开发,希望对大家有点帮助

    基于ASP的投票管理系统

    本系统是一个完整的ASP应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。 系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出优秀的ASP应用系统。 学生毕业设计好教材! 本系统是WEB模式的在线...

    [工具查询]苹果投票系统源码及毕业论文

    [工具查询]苹果投票系统源码及毕业论文 本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的

    ASPACCESS网上投票系统.zip

    ASP是一种面向Web的服务器端脚本语言,而Microsoft Access是一种关系数据库管理系统,两者的结合使得这些项目源码能够提供完整的Web应用程序解决方案。 这批ASPACCESS项目源码包括了多个功能丰富的Web应用程序,...

    计算机专业毕设精选-asp网上投票系统设计(论文+源代码+开题报告).rar

    **计算机专业毕设精选:ASP网上投票系统设计(论文+源代码+开题报告)** 本资源为计算机专业的学生提供了一个全面的毕业设计解决方案,涵盖了从需求分析、系统设计到实现和测试的完整过程。通过本资源,学生可以...

    基于django的投票系统.zip

    由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,可以专注于编写应用程序,而无需重新开发。它是免费和开源的,有活跃繁荣的社区,丰富的文档,以及很多免费和付费的解决方案。 [8]2019年12月2日,...

    基于vue3的投票系统.zip

    Vue3,springboot,element-ui使用技巧,实战应用开发小系统参考资料,源码参考。 详细介绍了一些Qt框架的各种功能和模块,以及如何使用Qt进行GUI开发、网络编程和跨平台应用开发等。 适用于初学者和有经验的开发者...

    公众号模块 螃蟹投票v2.1.9 全开源包更新

    螃蟹投票v2.1.9 是一款基于微信公众号开发的微信投票系统模块,一套专业的投票赚钱系统,送礼物投票活动,快速帮你吸粉赚钱!! 是一套专业的投票返利系统,背后是一个投票商学院,也是投票老司机的行业家园,还是一...

    ASP具有动态口令认证机制的网上投票系统的设计.zip

    其中包括但不限于电子商务平台、论坛系统、在线学习平台、内容管理系统等。这些项目源码具备高度可定制性和扩展性,允许开发人员根据具体业务需求进行定制和扩展,以实现最佳的用户体验和业务目标。 每个项目源码都...

    ASP+ACCESS网上投票系统(源代码+论文).zip

    通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入...

    Python框架的课堂投票系统_(项目源码+数据库脚本+文档+LW+PPT)

    这个基于Python技术栈的Web应用程序项目源代码提供了一个通用的框架,使得开发者能够学习如何构建可...这样的学习经验将使我们 更加自信地应对未来的开发挑战,同时也为技术社区的交流和分享贡献了更多有价值的内容。

    java实战项目_ssm__mysql_在线投票系统wlw__(源码+数据库脚本+文档).zip

    在线预览项目地址:在线...将自己对该系统的理解和实践经验分享给他人,促进技术互动和知识共享。 其他说明: 源代码系统基于JAVA开发,具备良好的可扩展性和可维护性。开发者可以根据实际需求进行二次开发和定制。

    《毕业设计&代码复用》--基于微信小程序投票评选系统的设计与实现ssm后端毕业源码案例设计.zip

    本人十余年JAVA从业经验,擅长JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA系统性的技术提升的同学可与我联系,交个朋友哦~ 本人十余年JAVA从业经验,擅长JAVA高可用、分布式、高并发系统架构设计。有志...

    对爱沙尼亚互联网投票系统程序组成部分的独立评估-研究论文

    2005 年在爱沙尼亚设计和实施的 I-Voting 系统是世界上第一个采用的互联网投票系统。 自开播以来,就受到了好评和关注。 问题包括面对面的选举观察、代码审查和对系统组件的对抗性测试。 由于这些担忧,一些政党得出...

    zuanshitoupiaoxitong+2.0.zip

    钻石投票系统是一款主要用于微信投票的软件,我们了解微信生态环境,在实战中积累了丰富的经验,熟知微信生态规则,微信开发规范,投票系统已累计服务100多万场活动。

    电子投票系统桌面应用程序:MCA学生

    你好 :waving_hand: ,我是Vivek Pandey程序员全栈开发人员| 学习者| 艺术家| 博客| Youtuber | 内容创建... :memo: 我定期在上写文章 :page_facing_up: 了解我的经验 :high_voltage: 有趣的事实与我联系:语言和工具:

    新一代PHP+MySQL+Dreamweaver网站建设典型案例

    本书内容包括:会员管理系统、新闻发布系统、PHP文件管理系统、网站访问量统计系统、Ajax聊天室系统、PHP在线相册系统、PHP在线投票系统、PHP留言簿系统、PHP校友录系统及匿名上传下载系统等。 本书不仅适合初学者...

Global site tag (gtag.js) - Google Analytics