深蓝色心情
过来聊聊~~~~
BlogJava
::
首页
::
联系
::
聚合
::
管理
31 Posts :: 0 Stories :: 46 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(7)
给我留言
查看公开留言
查看私人留言
我参与的团队
随笔分类
Java(20)
商业新闻(2)
游戏
软件安装入门(3)
非技术收藏
随笔档案
2012年7月 (1)
2012年2月 (1)
2012年1月 (1)
2011年12月 (1)
2011年11月 (2)
2011年8月 (2)
2011年7月 (2)
2011年5月 (1)
2011年3月 (1)
2011年2月 (1)
2011年1月 (1)
2010年12月 (1)
2010年10月 (3)
2010年6月 (2)
2010年5月 (3)
2010年4月 (2)
2006年2月 (1)
2006年1月 (2)
2005年12月 (1)
2005年11月 (2)
搜索
最新评论
1. re: show下我做的消息提醒的chrome插件,免费使用,呵呵(有效果图)
很好很有趣
顶!
--iLinux
2. re: 对于12306,我的完整技术方案
最近这方面的讨论好多啊。
--何杨
3. re: chrome扩展程序“超级提醒”,源代码开放!
支持开源啊
--Dahai
4. re: show下我做的消息提醒的chrome插件,免费使用,呵呵(有效果图)
评论内容较长,点击标题查看
--深蓝色心情
5. re: guzz 1.3.0大版本发布,支持Spring事务
不错啊
--tb
阅读排行榜
1. show下我做的消息提醒的chrome插件,免费使用,呵呵(有效果图)(8734)
2. 数据库分切设计何必纠结于hibernate shard模式,应该简单化了(4204)
3. 3行代码,实现IP到地理位置的反查功能(3414)
4. guzz使用效果和经验技巧分享(3397)
5. 改进架构,实现动态数据源,降低java维护(2955)
评论排行榜
1. 3行代码,实现IP到地理位置的反查功能(9)
2. show下我做的消息提醒的chrome插件,免费使用,呵呵(有效果图)(7)
3. guzz1.2.9更新发布,支持选举服务(6)
4. 改进架构,实现动态数据源,降低java维护(5)
5. 数据库分切设计何必纠结于hibernate shard模式,应该简单化了(5)
2011年11月24日
#
万众期待的guzz新版终于发布啦!各种期待的功能噢~~
亲爱的你萌是不是觉得哀家已经放弃了小谷子,不不不,原因只是因为哀家最近比较懒木有更新而已。哀家每年总有那么十来个月是比较懒的~~【望天
不过,这次更新绝对有货!在7月中发,也用来纪念我家的小桔梗殿下吧。
guzz 1.3.1 20120712更新介绍:
大版本更新噢:
1. 动态拼接SQL终于发布啦,等的花都谢了。现在,乃可以写一个有条件的sql语句,然后在执行时,guzz娘会根据传入的参数构造成真正需要的sql语句,然后再绑定参数执行。古娘默认是基于Velocity模板实现的,于是动态SQL拼接的语法、灵活性、易用性、学习成本是绝对足够的,velocity文档也是绝对的丰富和成熟。来仔细瞧瞧吧:
http://code.google.com/p/guzz/wiki/TutorialTemplatedSQLService?wl=zh-Hans
2. 受够了一个一个的添加域对象到guzz.xml中?是解放自己的时候啦。面对着大半年来的各种诉求,1.3.1版这次终于良心发现,增加了package-scan功能【泪目】。咱们也可以扫描文件并批量添加business啦。介是这个脑残:
http://code.google.com/p/guzz/wiki/TutorialHbmPackageScan?wl=zh-Hans
3. 在SQL中写时间串就报错? 虽然是小功能,但转义字符支持这次还是放出来啦。不害怕SQL注入,一门心思拼接SQL语句的孩纸们请看这里:
http://code.google.com/p/guzz/wiki/TutorialGuzzXml?wl=zh-Hans#sql语句中特殊字符转义
。搞死就这么玩吧,勇士们自己被黑了求别黑我家小谷子。
4. JDNI数据源这次也支持啦。感谢波波提供的代码。借机也感谢波波提供的其他代码。
http://code.google.com/p/guzz/wiki/TutorialDatasourceProvider?wl=zh-Hans#guzz内置连接池实现
5. 其他小功能和bug修正,本宫就不废话了。亲爱的你萌有兴趣就自己去对比SVN代码吧。
下面照例复制下宣传介绍。
什么是guzz?
guzz是一套用于多数据库编程的Java ORM框架,用于替代hibernate和ibatis,实现在一套系统中轻松使用多台数据库。guzz同时提供通用数据计算和配置管理等,简化系统复杂度,为系统在数据层的设计提供一站式解决方案。
guzz主要功能与特点:
现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
支持应用程序使用大量的数据库和主从读写分离
支持数据库表在多组机器间水平分布(Shard),并自动维护多组机器之间的分布式事务
支持1张表按照业务规则分切成多张小表(Shadow),并支持每张小表拥有自己特殊的属性字段(Custom)
支持1张大表分切后的小表,分布到不同的数据库中(VirtualDB)
支持超越范式的特殊关联、非结构化数据等异构资源POJO模式的统一读取
支持组件化服务(SOA)和服务相互依赖,构建企业/项目实施基础平台
提供面向对象的数据库读取标签(JSP Taglib),加快页面展示层的快速变更、开发与部署
对于大部分场景,支持像hibernate一样的对象持久、映射和方便的增删改查,提高开发效率
对于复杂场景,支持像ibatis一样,让DBA参与SQL设计的复杂数据库操作和优化,以及SQL在线调试
更简洁、更好用、更容易控制的批操作接口
支持在线加载与调试SQL。按照应用策略,从文件/数据库/Web Service等途径,动态提取与使用SQL语句(Dynamic SQL)
支持配置管理服务器,可以使用一套软件系统对所有应用程序的配置进行统一管理
项目地址:
http://code.google.com/p/guzz/
文档:
http://code.google.com/p/guzz/wiki/AboutGuzz?tm=6
下载:
http://code.google.com/p/guzz/downloads/list
新浪微博:
http://weibo.com/guzzframework
扣扣群:
36429094 218658794
Mail List:
https://lists.sourceforge.net/lists/listinfo/guzz-mail-users
posted @
2012-07-18 08:32
深蓝色心情 阅读(1544) |
评论 (0)
|
编辑
收藏
guzz1.3.0 多配置文件支持发布
guzz 1.3.0 20120222更新介绍:
本次为改进型更新:
1. 增加了默认的多properties配置文件支持。方便配置管理和部署。详细介绍[url] http://code.google.com/p/guzz/wiki/TutorialAppProperties?wl=zh-Hans[/url]
2. WriteTemplate增加了2个新接口,方便更好的进行sql语句直接操作。
3. 修正了打印sql语句的错误配置方式。
什么是guzz?
guzz是一套用于多数据库编程的ORM框架,用于替代hibernate和ibatis,实现在一套系统中轻松使用多台数据库。guzz同时提供通用数据计算和配置管理等,简化系统复杂度,为系统在数据层的设计提供一站式解决方案。
guzz主要功能与特点:
现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
支持应用程序使用大量的数据库和主从读写分离
支持数据库表在多组机器间水平分布(Shard),并自动维护多组机器之间的分布式事务
支持1张表按照业务规则分切成多张小表(Shadow),并支持每张小表拥有自己特殊的属性字段(Custom)
支持1张大表分切后的小表,分布到不同的数据库中(VirtualDB)
支持超越范式的特殊关联、非结构化数据等异构资源POJO模式的统一读取
支持组件化服务(SOA)和服务相互依赖,构建企业/项目实施基础平台
提供面向对象的数据库读取标签(JSP Taglib),加快页面展示层的快速变更、开发与部署
对于大部分场景,支持像hibernate一样的对象持久、映射和方便的增删改查,提高开发效率
对于复杂场景,支持像ibatis一样,让DBA参与SQL设计的复杂数据库操作和优化,以及SQL在线调试
更简洁、更好用、更容易控制的批操作接口
支持在线加载与调试SQL。按照应用策略,从文件/数据库/Web Service等途径,动态提取与使用SQL语句(Dynamic SQL)
支持配置管理服务器,可以使用一套软件系统对所有应用程序的配置进行统一管理
项目地址:
http://code.google.com/p/guzz/
文档:
http://code.google.com/p/guzz/wiki/AboutGuzz?tm=6
下载:
http://code.google.com/p/guzz/downloads/list
新浪微博:
http://weibo.com/guzzframework
扣扣群:
36429094
Mail List:
https://lists.sourceforge.net/lists/listinfo/guzz-mail-users
posted @
2012-02-22 15:29
深蓝色心情 阅读(1317) |
评论 (0)
|
编辑
收藏
对于12306,我的完整技术方案
12306主要就是卖票比较复杂,注册登录之类的功能就不说了。
有网友说,12306卖票系统比航空复杂,因为要分段卖,航空只有起点和终点,火车中间还有好多站。不过好消息是,这些站在售票时是连续的,不会出现1张票跳着站买的情况,这样就可以把一张票拆成N张只有起点和终点的票,和航空售票一样了。
卖票分为两部分,查询和购买。12306目前提供了单独的查询,我觉得这个其实挺好的,至少有读写分离的思想;不过延迟10分钟的数据,肯定没什么人愿意用,大家还是要挤进购买系统查询。单独的查询相当于摆设了,没有发挥作用。要让查询系统有效,尤其是春运期间,延迟应该在30秒之内。
查询剩余票数设计:
查询的特点是按照车次信息或者时间查,车次和时间一般都不会变,因此在设计时,可以把页面分成两部分。一是匹配的车次列表信息,如北京到上海有哪些车,这个结果可以用CDN缓存。车次基本是固定的,缓存设置为10分钟应该就能满足需要。不占用负载。在浏览器拿到这个页面后,通过异步请求,根据每趟车的编号二次查询剩余票数等实时数据,合并显示。
车次查询时,把车次信息分库存储,并作冗余存储。好比这个库提供所有北京->xxx的查询,这个库提供上海到xxx的查询,这个库提供广州到xx的查询,剩下的在一个大库中等。车次变化很小,库可以分散存,而且可以冗余存储。用内存表也行,总数据量也不多,性能上没什么可说的。
对于实时票数,确实是比较困难的,网上很多方案都不对,没有考虑中间站的问题。剩余票数缓存并不好做。我的想法是,提前分好票,然后用单独的数据结构做缓存。
例如,对于G113高铁,共有8站:北京、德州、济南、徐州、南京、常州、苏州、上海。假设它有两千张票,座位啊卧铺啊啥的。在发票前,创建新表20120113_G113,然后把2000张票提前插入到表中,每个票都有一个本表内唯一的数字编号。表结构基本上就是:编号、起始站、终点站、座位类型、车厢、座位号、乘客姓名、乘客证件号码、车票状态等实际业务模型需要。初始化时,起点站就是北京(根据顺序存储为1),终点站就是上海(根据顺序存储为8),乘客信息空着表示尚未绑定乘客,车票状态置为“待出售”。
这样我们要查询2012年1月13号G113 济南->南京 的剩余票数时,就查询20120113_G113起始站编号大于等于3并且小于等于5,并且状态为“待出售”的记录数就行了。
每张表2000条数据,对于非春运时节,性能完全足够。对于春运时节,非繁忙路段,性能应该也足够了。对于春运繁忙期,继续看下面的。
车票出售基本流程:
用户选择车票并要求购买,系统锁定票并标记状态为“锁定中”,让用户付款等。完成后标记车票为“已经发售”,并且更新用户信息到车票的持有人信息字段中。此票不再出售。
对于中间站购票,假设用户购买了 济南->南京 ,前面流程不变。但完成出票后,将车票起始和终点站改为“济南”和“南京”,并且自动插入两张新票可用。一张是“北京->济南”,一张是“南京->上海”,通知队列更新相关缓存。相当于车票做了自动分裂。这样我们设计时只需要把一张票设计为“只有起点和终点”就行了。
更高效的剩余票数查询设计:
数据库的count操作并不快,因此对于繁忙季节的繁忙表,每次都count是铁定不行的。我想到的一个办法是:把上面提到的预售车票表加载到内存中。我们用一个64位long类型数字表示一张车票,每趟车的每种座位类型是一个long数组。
对于每个long数字,前面的32位用来顺序存储32个车站(假设一趟车最多有32个站,没查过,不行可以放长点),每一位标记“车票是否包含此站”。如G113 济南到南京的票(车站顺序为第3到第5站),long数字的第2到第4位设置为1,其他前32位设置为0。后面的32位用来表示车票在车票出售表中的唯一编号。这样根据一个long类型数字,我们就能表述一张票的发售信息了。
比如2012年1月13号G113,有软卧500张和硬卧1500张。那就需要两个数组。20120113_G113_软卧 对应一个长度500的long数组;20120113_G113_硬卧 对应一个长度1500的long数组。存储所有售票信息。
有点类似BitSet的感觉,对空间要求不高。我们可以做个系统把所有车票信息按照这种结构加载到内存中。对于实时查票,如查询2012年1月13号G113车次 济南->南京 的余票,就是遍历两个数组,检查位数为2和4的long数字有多少个,就直接获得了软卧和硬卧的剩余票数。对于现代计算机,这点遍历,时间是纳秒级的。
当车票被出售后,从long数组中删除票信息,比如先置为-1表示已经无效。再用后台线程实际删除(避免写冲突,将删除延迟到重建一个数组所消耗的多少纳秒内刚好没有写请求的时间段中)。如果long数组长度为0,那就是没有车票了,直接返回0;用户再怎么刷,也不会干扰数据库。
更高效的剩余票数查询方案的扩展性和容错性:
本身车票是按照车次划分的,同时也有时间维度,横向扩展不存在任何问题。
long数组可以根据数据库票务信息重新构造,而且成本不高(一条“select * from xxx where 状态=待发售” SQL语句)。在硬件故障,扩容机器,或是发现数据不一致时,重新构造数组就行。而且可以从后台异步做。扩展性和容错性都不是问题。
售票交易与锁票:
用户查询到有票后,填写要购买的票数,提交。好比购买两张硬卧,流程如下:
1. 在20120113_G113_硬卧long数组中随机获取符合要求的顺序的两个long数字,并将其从数组中删除;这个速度很快,纳秒级;
2. 根据long数字后32位,从数据库中锁票。如果全部锁定成功,设置票为预定状态,更新用户预定信息,锁票时间等。然后记录日志等其他相关操作。如果锁票失败,说明在纳秒级的时间内,票还是有冲突,购票失败,直接返回报错。锁票就是数据库行锁,sql中的 select for update nowait。
3. 页面提示错误,或者进入下一步交易流程,如网银支付等。
在整个过程中,我们看到,用户请求就算集中爆发,事务的冲突性也能降低到“随机获取的long数组值刚好一样 + 在cpu执行2000个for循环的可能百万分之一秒内刚好同时提交”。我觉得冲突概率应该很低很低。一趟车2000个车票,1:100比例也就20万人同时抢,20万人同1秒提交cpu也算的过来。而实际上,怎么可能一秒钟有20万人同时抢一趟车的票哪……
在整个过程中,大部分请求都被long数组消耗完后,直接检查long数组长度为0,提示无票拦截。进入数据库阶段的,也就是比实际的票数多一点点的有效订单而已。
回票:
中间站买票的,在预定成功后,车票自动分裂,分裂的票可以通过队列调度实时的回到long数组中,继续服务。
预定后不买的,可以通过预定时间的超时检查,后台做个线程,让票回归。
欢迎讨论。
微博:
http://weibo.com/guzzframework
posted @
2012-01-16 19:48
深蓝色心情 阅读(2483) |
评论 (1)
|
编辑
收藏
chrome扩展程序“超级提醒”,源代码开放!
chrome插件,用于统一提醒来自gmail, yahoo,hotmail,新浪微博。。。等多家主流网站的新邮件或新通知。喜欢的朋友可以加入此项目,继续加对更多网站的支持!
http://code.google.com/p/notifyall/
posted @
2011-12-01 13:16
深蓝色心情 阅读(2004) |
评论 (1)
|
编辑
收藏
guzz 1.3.0大版本发布,支持Spring事务
摘要: guzz是一套用于多数据库编程的ORM框架,实现在一套系统中轻松使用多台数据库。在这次更新中,您可以像配置Hibernate一样配置Guzz,让Spring进行声明式的全局事务管理。Guzz Spring事务支持标准Spring事务的所有配置,除了嵌套事务和JTA。
阅读全文
posted @
2011-11-24 08:43
深蓝色心情 阅读(1588) |
评论 (1)
|
编辑
收藏
Copyright @ 深蓝色心情
Powered by:
.Text
and
ASP.NET
Theme by:
.NET Monster