1人30天44587行代码,分享舍得网开发过程
舍得网(shedewang.com)的开发暂时告一段落,一个人用时不到1个月,java底层代码16902行,jsp代码27685行,共计 44587行。整个开发过程遇到过许多问题,但最后都解决了。下面把我在开发中遇到的所有问题和解决办法列出,本人水平一般,仅供同僚们参考。
系统构架: redhatAS4/apache2.0.59/resin2.1.17/jdk6.0u2/hibernate3.0/lucene2.2/urlrewrite3.0.4, 数据库用得是mysql4.1.15,数据库缓存是构架在hibernate之上的,是一个只有794行的java类,但这个java类却做了数据库对象 缓存、列表缓存、update缓冲、自动删除列表缓存,还提供了数据库查询、更新、插入的所有操作,它节省了我一半以上的开发时间。一个获取含有五个查询 条件获取列表的方法只用不到10行代码就可以了。
问题一:做数据库缓存时遇到的问题。Map在并发遍历时会报ConcurrentModificationException,即使使用 Collections.synchronizedList把Map包起来还是会报这个异常,这个问题很简单,解决办法也简单。第一种解决办法是不要用 Map的iterator来遍历,而是用Set(Map.keySet方法)的toArray方法来遍历,这种办法虽然会损耗一定的性能和内存,但比在方 法前加synchronized好得多;第二种解决办法用jdk5.0以后的ConcurrentHashMap来实现。(我的数据库的缓存用的是 apache的LRUMap,用第一种解决办法,第二种解决办法我也准备好了,随时可以更换)
问题二:jfreecharts在Linux上不能显示中文,这个问题没有费多长时间就解决了,上网一搜就搞定,解决方法如下:
到网上下载一个linux下的ttf字体,本例用的是zysong.ttf
1.确认%JavaHome%/jre/lib/fonts目录下存在zysong.ttf
2.在%JavaHome%/jre/lib/fonts目录下执行"ttmkfdir-ofonts.dir"命令,重新生成fonts.dir文件
3.确认/usr/share/fonts/zh_CN/TrueType目录存在,如果不存在则mkdir创建
4.确认/usr/share/fonts/zh_CN/TrueType目录下存在zysong.ttf
5.在%JavaHome%/jre/lib目录下,执行cpfontconfig.RedHat.3.properties.srcfontconfig.properties
6.重起resin,OK。
问题三:linux下的toomanyopenfiles错误,这个问题比较严重,AS4默认打开文件数是1024,如果超过这个数,resin就自动down掉了,非常恶心。解决办法如下:
echo65536> /proc/sys/fs/file-max
编辑/etc/sysctl.conf文件,编辑行fs.file-max=65536
编辑文件/etc/security/limits.conf,增加行*-nofile65536
用ulimit-a查看,如果看到行openfiles(-n)65536就说明对了
问题四:内存泄露,表现出来的特征是CPU占到99.9%,内存由10%左右经过几个小时后慢慢涨到50%,最后死掉。做java的人知道,这个问题非常 痛苦,而且没有很好的解决办法,因为直接看代码很难看出来。我原来一直以为问题会出现在缓存上,但仔细想想apache的LRUMap不至于产生内存泄 露,尤其我设置了LRUMap最大长度只有10000,10000个内存对象能有多大,后来发现是SmartUpload的问题,改成apache的 FileUpload子项目就可以了。另外,我在设置jvm参数时增加了-Xmx2048m-Xms2048m-Xmn768m-Xss512k -XX:+UseParallelGC-XX:ParallelGCThreads=4-XX:+UseParallelOldGC-XX:+UseAdaptiveSizePolicy 这些参数,可以回收年老区的内存,现在比较稳定,一般内存占到27%左右就不会再涨了,可能这些参数还不是最优的,有待探索。另外查找内存泄露的软件 JProbe我也玩了玩,的确看出其他代码没有明显内存泄露。
问题五:搜索分词。一个用户在用舍得网时反映,看到有“啤酒”和“茅台酒”,为什么搜“酒”搜不出来,原因很简单,“啤酒”和“茅台酒”是单独一个词, lucene写入的时候没有再把它拆开,所以必须要搜“啤酒”或“茅台酒”才能搜出来,这在技术上合理,但是用户觉得不合理。所以我改进了搜索算法,把中 国3万多个汉字也加到词库中,而且在写入和搜索时用不同的分词算法,如“我喜欢喝啤酒”在写入时会分成“我+喜欢+喝+啤酒+喜+欢+啤+酒”,而在搜索 时这句话会被分词为“我+喜欢+喝+啤酒”,这样,用户搜“啤酒”能搜到,搜“酒”也能搜到,而对应另外一句话“这人啤气不好,总喝酒”搜“啤”和“酒” 都能搜到,但搜“啤酒”却搜不到,似乎有点意思。但是这么分词也会有点小问题,就是搜索的结果不太人性化。(我的中文词库加成语加汉字共50多万个,比起 一般网上十来二十万要丰富得多,不过这没什么大用)
问题六:URL链接“静态化”。本想直接用apache的URLRewrite来实现,发现不太可能,于是改用urlrewirte实现,配置没什么难 度,但是要注意resin的web-app里须增加一行配置 <servlet-mappingurl-pattern='*.htm'servlet-name='plugin_match'/> ,这样apache才会把htm结尾的请求转交给resin,否则apache报404错误,这在一般structs项目中都会提到。现在看到的舍得网 http://shedewang.com/pg_5_c_2_index.htm,其实就是http: //shedewang.com/index.jsp?pg=5&c=2,呵呵,没什么特别的。
问题七:IE6/IE7/FF的适配,这体现在许多细节上,如FF的回车事件捕获,IE7的href=#页面会移动等等问题上,多测几次,多上网找找也就 都解决了。很多人开发网站似乎不太会管FF能不能看,但好歹我也在SP混过几年,做WAP的时候要适配10来款手机,做web适配三五个浏览器不算什么。
问题八:linux自身的bug。远程连接mysql时有时mysql似乎会重起,这个问题似乎是linux自身的bug,好像和解析有点关系导致 mysql崩溃。解决办法:启动mysql增加一个参数,如下:/usr/local/mysql/bin/mysqld_safe--user= mysql--skip-name-resolve&
问题九:hiberate配置文件的问题,配置不好的话总是会报NESTEDException,或者多用户并发的时候报错。我想一般人都遇到过了,增 加一个c3p0的配置段,尤其注意max_statements设置稍微大一点,原来我设置为100的时候10个用户同时创建记录就会出错。
<propertyname="hibernate.connection.provider_class"> org.hibernate.connection.C3P0ConnectionProvider </property>
<propertyname="hibernate.c3p0.max_size"> 200 </property>
<propertyname="hibernate.c3p0.min_size"> 20 </property>
<propertyname="hibernate.c3p0.timeout"> 3600 </property>
<propertyname="hibernate.c3p0.max_statements"> 1000 </property>
<propertyname="hibernate.c3p0.idle_test_period"> 300 </property>
<propertyname="hibernate.c3p0.acquire_increment"> 5 </property>
<propertyname="hibernate.c3p0.validate"> false </property>
问题十:ajax的运用问题。提交大文本时似乎不能用prototype提供的Ajax.Updater,要自己创建一个AJAX对象,然后把内容 send过去,具体js代码可以参考舍得网的comm.js,另外用jsp获取Ajax提交的内容如果是乱码,把jsp改成UTF-8编码即可。AJAX 运用好了的确可以增加用户感受,而且可以让代码的松散耦合性更好,可以把一大段逻辑写在一个小的jsp里面。
Postfix邮件服务器配置和上传图片缩放更是我遇到最困难的问题,一言难尽,有兴趣的朋友可以加MSN:bruce_lau@163.com了解了解。
分享到:
相关推荐
舍得网站源代码 更多资源请访问http://www.59186618.com
QQ机器人对话库一开始是很空白的,如你舍得教它说话, 则它可以变得很强大,至少在 网购客服方面是足够需求的。就看你怎么设计对话数据库了。 关于设计对话数据库, 可以看下面说明。 开发工具:VS2008 代码权限...
NULL 博文链接:https://woairenyunli.iteye.com/blog/408838
包含了分布式解决方案,该系统已经应用在舍得网上了,没有发现大问题,本人也相信该系统已经足够强大,应付数百万IP/天的应用都不是问题,我这么说肯定有人会对此表示怀疑,其实系统到底能撑多少IP/天不在于系统本身...
在电脑上翻出一个十年前学C语言时写的一个小游戏,代码虽比较散乱,但由于它是我的第一个算是比较完整的游戏吧,所以没舍得丢弃它。玩起来挺好玩的,玩好了,还有C语言画的漂亮图形奖励呢!
Piotr Wozniak和那些专门研究人脑学习能力的小组成员们开发的产品。这个著名的软件曾经获过多次奖项,并且达到了1百万销量的好成绩。 功能: · 与传统的记忆法相比(用卡片帮助记忆),它可以提高最多10-50倍的效率; ...
Piotr Wozniak和那些专门研究人脑学习能力的小组成员们开发的产品。这个著名的软件曾经获过多次奖项,并且达到了1百万销量的好成绩。 功能: · 与传统的记忆法相比(用卡片帮助记忆),它可以提高最多10-50倍的效率; ...
我初学c时自己写的一些小程序附代码。一直不舍得删~代码与程序相对应~可能有些没编译的。
舍得网支撑1亿pv/天构架,开源了 说是支持1亿pv/天,也许有点夸张,也是为了吸引您能点进来,如果您能认真看完相信也不会让您失望,当然,肯定有很多“高手”会对此会嗤之以鼻,没关系,有很多眼高手低的人总喜欢...
20210405-天风证券-ST舍得-600702-真金火炼,沱牌舍得曲折探索走向康庄大道.pdf
完整版本代码+文档+注释+说明ssh_project教学互动社区完整版本ssh论坛ssh教学教程要不是毕业好几年我都不舍得分享出来!!! CTRL+D收藏一下或者关注走一波-有你所需!不断更新! 其他相关下载,配套代码以及PPT。...
别看了没用,就是nacsh交通流代码,上传只是不舍得删,也为了自己方便找,不需要看,要看也是看有注释的版本
基于类别的稀疏表示分类器的简单实现,MATLAB代码版本 一共10个.m文件,各自作用简单介绍如下(实际上只用到了下面第一部分的七块代码): cdSRC.m 主程序 normalize_data.m 用来对原始数据归一化 lda.m 用来对...
c#ASP.net大作业游戏资讯网站代码+文档+数据库sql说明+搭建教程+PPT全部完整版本ASP.net大作业游戏资讯网站要不是毕业好几年我都不舍得分享出来!!! CTRL+D收藏一下或者关注走一波-有你所需!不断更新! 其他相关...
6 4.4网站的运行环境设计 6 5、网站实施 7 5.1网站的设计时间计划 7 5.2网站代码设计 7 5.3网站的测试 7 5.4网站的发布 8 6、网站的运行和维护 8 7、网站的营销和推广 8 8、总结 9 1、网站设计和制作背景 1.1 母婴...
酒水行业周报(2021年1月第1期):贵州茅台圆满完成年度目标,舍得股东易主复星集团.pdf
20210810-国泰君安-舍得酒业-600702-首次覆盖报告:舍得复兴.pdf
很多人都想拥有自己的博客,但苦于不会开发,又不舍得花钱购买,想从网上下载个不花钱的,不是功能不全就是风格不满意,要是购买个博客再加上空间域名费用将近千元,前一段时间我也从网上找过仿QQ空间这样的博客,找...