首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
Java
Web 开发
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
1人30天44587行代码,分享舍得网开发过程
[已结贴,结贴人:java2000_net]
加为好友
发送私信
在线聊天
liuaike
KK
等级:
发表于:
2008-01-24 16:08:59
楼主
1人30天44587行代码,分享舍得网开发过程
舍得网(shedewang.com)的开发暂时告一段落,一个人用时不到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,即使使用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 -o fonts.dir"命令,重新生成fonts.dir文件
3.确认/usr/share/fonts/zh_CN/TrueType目录存在,如果不存在则mkdir创建
4.确认/usr/share/fonts/zh_CN/TrueType目录下存在zysong.ttf
5.在%JavaHome%/jre/lib目录下,执行 cp fontconfig.RedHat.3.properties.src fontconfig.properties
6.重起resin,OK。
问题三:linux下的too many open files错误,这个问题比较严重,AS4默认打开文件数是1024,如果超过这个数,resin就自动down掉了,非常恶心。解决办法如下:
echo 65536 > /proc/sys/fs/file-max
编辑/etc/sysctl.conf 文件,编辑行 fs.file-max = 65536
编辑文件/etc/security/limits.conf,增加行 * - 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项目中都会提到。现在看到的舍得网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配置文件的问题,配置不好的话总是会报NESTED Exception,或者多用户并发的时候报错。我想一般人都遇到过了,增加一个c3p0的配置段,尤其注意max_statements设置稍微大一点,原来我设置为100的时候10个用户同时创建记录就会出错。
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property>
<property name="hibernate.c3p0.max_size">200 </property>
<property name="hibernate.c3p0.min_size">20 </property>
<property name="hibernate.c3p0.timeout">3600 </property>
<property name="hibernate.c3p0.max_statements">1000 </property>
<property name="hibernate.c3p0.idle_test_period">300 </property>
<property name="hibernate.c3p0.acquire_increment">5 </property>
<property name="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了解了解。
问题点数:
0
回复次数:
45
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lanzhengwu
牧人兰
等级:
发表于:
2008-01-24 16:35:55
1
楼 得分:
0
恩,不错不错,
能开源不?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
farandfaraway
遥远
等级:
发表于:
2008-01-24 16:51:05
2
楼 得分:
0
不错的问题总结,值得参考,顶一个
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
songfuqiang
拉帮结伙
等级:
发表于:
2008-02-04 11:06:39
3
楼 得分:
0
楼主只用了hibernate3 请问其它还有什么框架没?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
bhd8421
疯子
等级:
发表于:
2008-02-04 16:44:42
4
楼 得分:
0
狂人啊!哈
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ora92
等级:
发表于:
2008-02-05 01:18:51
5
楼 得分:
0
这个系统你一人做的吗,有点不相信哦
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
gtrr34jjr
gtrr34jjr
等级:
发表于:
2008-02-05 03:08:02
6
楼 得分:
0
。。。狂人。。。。。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yami251139
精彩没结局的戏,我们像不像电影,当看着我的人都散去,我才看见我自己。。。
等级:
发表于:
2008-02-05 09:19:19
7
楼 得分:
0
恭喜樓主哦
不過1個人有點辛苦
下次碰到這種事情找我分擔點吧
就當我免費學習。。不收錢的
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hynet
输入你的社区昵称
等级:
发表于:
2008-02-05 09:55:06
8
楼 得分:
0
楼主开源吧
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
bruce_lau
等级:
发表于:
2008-03-11 16:18:07
9
楼 得分:
0
改一点,经过实践,关于问题一,只能用第二种解决办法,并发遍历只能用ConcurrentHashMap,在这里要谢谢写ConcurrentHashMap的专家们提供了这么好的工具;关于问题四:我试过了许多中参数配置,最好的是只设置Xmx和Xms参数,并把这两个值设置成一样大,我的配置是-Xms768M -Xmx768M,这样我才每天都可以看到java稳定的回收内存,当内存使用量到达20%左右时(20%x4G约为800多M),java会启动垃圾回收,内存占用量可以从20%喀嚓就降到12%,以后趋于稳定。
最近我已经把缓存做成分布式了,实现了两级分布式缓存,速度应该是相当的快,只要带宽足够,5台服务器撑个100万用户/天应该不是问题,如果还不够再增加java应用服务器即可,该几行配置即可。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
bruce_lau
等级:
发表于:
2008-03-11 16:35:51
10
楼 得分:
0
网上有很多介绍分布式缓存的解决方案,用到比较多得是memcached。用memcached来缓存一行数据(单个对象)比较有效,但是列表的缓存还是比较头痛得事。比如新插入了一行记录,默认active字段值是0,通过后台把active改成1后才能显示,这个修改影响了列表和排序,这种情况任何自动缓存都做不到智能获取(网上介绍的memcache_engine,memcachedb,berkeley DB应该都不行),而我写的分布式系统还可以缓存列表。
做程序也是做人。如果我的这些代码经过大规模并发操作没有问题,我会把它开源的!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wdman
只提供解决方案,代码另外收分。
等级:
发表于:
2008-03-11 16:53:52
11
楼 得分:
0
不错不错!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
chjx1982
小猩猩
等级:
发表于:
2008-03-11 17:16:29
12
楼 得分:
0
真是牛人啊,我有这么厉害,该考虑换工作了,我现在需要这么一套框架,能开源不??强烈要求,下面的哥们支持下.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zengcity
不上进的青蛙2.0
等级:
发表于:
2008-03-11 18:02:58
13
楼 得分:
0
佩服楼主
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
JadoNet
http://javado.blog.163.com
等级:
发表于:
2008-03-11 23:54:08
14
楼 得分:
0
mark 一下,有时间看看,现在要睡觉了,明天还要上班,哈
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
isaaq
不会飞的鱼
等级:
发表于:
2008-03-12 00:20:46
15
楼 得分:
0
不错 ,佩服佩服
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
token1984
等级:
发表于:
2008-03-12 11:08:39
16
楼 得分:
0
呵呵 学习学习 楼主厉害
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zernel
等级:
发表于:
2008-03-12 15:48:45
17
楼 得分:
0
楼主在哪高就?
不是solo人吧
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
dennyyang
等级:
发表于:
2008-03-12 16:16:28
18
楼 得分:
0
楼主是高手!!!!!钦佩!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhangyu_fox
小皮
等级:
发表于:
2008-03-12 16:18:28
19
楼 得分:
0
看过了,老帖子,上次就强烈需求持久层代码,头发等白了都没回音。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
shili150
苏小小
等级:
发表于:
2008-03-12 16:48:24
20
楼 得分:
0
顶一个
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
shili150
苏小小
等级:
发表于:
2008-03-12 16:52:49
21
楼 得分:
0
嘛也别说了
我对您的景仰之情 如滔滔江水连绵不绝,如黄河泛滥一发不可收拾
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhuyx808
花心小和尚(念了十几年的经才知道,原来和尚也能吃肉!)
等级:
发表于:
2008-03-12 16:56:58
22
楼 得分:
0
开源不?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
gaofeng0416
高峰
等级:
发表于:
2008-03-12 18:10:18
23
楼 得分:
0
赞同开源!!~~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zznj1123
等级:
发表于:
2008-03-12 20:46:30
24
楼 得分:
0
赞同开源!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ganguozai
国仔
等级:
发表于:
2008-03-12 22:52:00
25
楼 得分:
0
难以置信,牛比啊!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
mengxianhua
该用户很懒,没有填写自己的个人昵称
等级:
发表于:
2008-03-13 13:42:27
26
楼 得分:
0
楼主,很强
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
paomadeng
等级:
发表于:
2008-03-14 13:14:21
27
楼 得分:
0
其实这个网站不难做,可能楼主对相应的技术不太熟悉
不过,谢谢分享
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zzmsl
z
等级:
发表于:
2008-03-17 09:02:24
28
楼 得分:
0
分布式缓存这个比较关注。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qustwmt
心如止水
等级:
发表于:
2008-03-18 16:47:57
29
楼 得分:
0
恩,确实挺牛的,给了我学习的压力,同样也给了我动力
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
linuowjh
等级:
发表于:
2008-03-19 11:49:06
30
楼 得分:
0
一个人?不太信.我靠.莫非是广告........
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
mysoko
等级:
发表于:
2008-03-19 13:14:29
31
楼 得分:
0
帖子不错!
顶个!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
gdgde
jprofiler
等级:
发表于:
2008-03-19 18:48:04
32
楼 得分:
0
楼主,你就从了我们,开源吧
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
banditgao
等级:
发表于:
2008-03-27 00:10:46
33
楼 得分:
0
强烈支持开源啊
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xushun
等级:
发表于:
2008-03-27 14:06:26
34
楼 得分:
0
顶
太强了
如果能详细说说您的开发经验那就更好了
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
icelovebai
冰冰
等级:
发表于:
2008-03-27 15:59:33
35
楼 得分:
0
楼主太强大了。。。
修改