跑步

1人30天44587行代码分享舍得网开发

2019-10-13 03:47:42来源:励志吧0次阅读

费了不少心思才写出来这么写东西,希望斑竹加个精或者置个顶

,谢谢!

舍得(shedewang.)的开发暂时告一段落,一个人用时不到1个月,java底层代码16902行,jsp代码27685行,共计44587行。整个开发过程遇到过许多问题,但最后都解决了。下面把我在开发中遇到的所有问题和解决办法列出,本人水平一淮南治牛皮癣果医院般,仅供同僚们参考。

系统构架:redhat AS4/apache2.0.59/resin2.1.17/jdk6.0 u2/hibernate3.0/lucene2.2/urlrewrite3.0.4,数据库用得是mysql4.1.15,数据库缓存是构架在hibernate之上的,是一个只有794行的java类,但这个java类却做了数据库对象缓存、列表缓存、update缓冲、自动删除列表缓存,还提供了数据库查询、更新、插入的所有操作,它节省了我一半以上的开发时间。一个获取含有五个查询条件获取列表的方法只用不到10行代码就可以了。

问题一:做数据库缓存时遇到的问题。Map在并发遍历时会报ConcurrentModificationException,即使使用nchronizedList把Map包起来还是会报这个异常,这个问题很简单,解决办法也简单。第一种解决办法是不要用Map的iterator来遍历,而是用Set(ySet方法)的toArray方法来遍历,这种办法虽然会损耗一定的性能和内存,但比在方法前加synchronized好得多;第二种解决办法用jdk5.0以后的ConcurrentHashMap来实现。(我的数据库的缓存用的是apache的LRUMap,用第一种解决办法,第二种解决办法我也准备好了,随时可以更换)

问题二:jfreecharts在Linux上不能显示中文,这个问题没有费多长时间就解决了,上一搜就搞定,解决方法如下:

到上下载一个linux下的ttf字体,本例用的是f

1.确认%JavaHome%/jre/lib/fonts目录下存在f

2.在%JavaHome%/jre/lib/fonts目录下执行ttmkfdir -o r命令重新生成r文件

3.确认/usr/share/fonts/zh_CN/TrueType目录存在如果不存在则mkdir创建

4.确认/usr/share/fonts/zh_CN/TrueType目录下存在f

5.在%JavaHome%/jre/lib目录下执行 cp c operties

6.重起resin,OK。

问题三:linux下的too many open files错误,这个问题比较严重,AS4默认打开文件数是1024,如果超过这个数,resin就自动down掉了,非常恶心。解决办法如下:

echo 65536 /proc/sys/fs/file-max

/etc/nf 文件,行 le-max = 65536

文件/etc/security/nf,增加行 * - nofile 65536

用ulimit -a 查看,如果看到行open files (-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的URL Rewrite来实现,发现不太可能,于是改用urlrewirte实现,配置没什么难度,但是要注意resin的web-app里须增加一行配置servlet-mapping url-pattern='*.htm' servlet-name='plugin_match'/,这样apache才会把htm结尾的请求转交给resin,否则apache报404错误,这在一般structs项目中都会提到。现在看到的舍得://shedewang./pg_5_c_2_m,其实就是://shedewang./p?pg=5c=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配置文件的问题,配置不好的话总是会报NESTED Exception,或者多用户并发的时候报错。我想一般人都遇到过了,增加一个c3p0的配置段,尤其注意max_statements设置稍微大一点,原来我设置为100的时候10个用户同时创建记录就会出错。

property name=ovider_ection.C3P0ConnectionProvider/property

property name=x_size200/property

property name=n_size20/property

property name=meout3600/property

property name=x_statements1000/property

property name=le_test_period300/property

property name=quire_increment5/property

property name=lidatefalse/property

问题十:ajax的运用问题。提交大文本时似乎不能用prototype提供的dater,要自己创建一个AJAX对象,然后把内容send过去,具体js代码可以参考舍得的,另外用jsp获取Ajax提交的内容如果是乱码,把jsp改成UTF-8编码即可。AJAX运用好了的确可以增加用户感受,而且可以让代码的松散耦合性更好,可以把一大段逻辑写在一个小的jsp里面。

Postfix邮件服务器配置和上传图片缩放更是我遇到最困难的问题,一言难尽,有兴趣的朋友可以加MSN:bruce_lau@163.了解了解。

小程序 积分商城
免费小程序制作
怎样进入有赞微商城
分享到: