深蓝色心情

过来聊聊~~~~

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  31 Posts :: 0 Stories :: 46 Comments :: 0 Trackbacks

2012年7月18日 #


亲爱的你萌是不是觉得哀家已经放弃了小谷子,不不不,原因只是因为哀家最近比较懒木有更新而已。哀家每年总有那么十来个月是比较懒的~~【望天

不过,这次更新绝对有货!在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 深蓝色心情 阅读(1417) | 评论 (0)编辑 收藏

2012年2月22日 #

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 深蓝色心情 阅读(1222) | 评论 (0)编辑 收藏

2012年1月16日 #

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 深蓝色心情 阅读(2341) | 评论 (1)编辑 收藏

2011年12月1日 #


chrome插件,用于统一提醒来自gmail, yahoo,hotmail,新浪微博。。。等多家主流网站的新邮件或新通知。喜欢的朋友可以加入此项目,继续加对更多网站的支持! 

http://code.google.com/p/notifyall/ 
posted @ 2011-12-01 13:16 深蓝色心情 阅读(1871) | 评论 (1)编辑 收藏

2011年11月24日 #

     摘要: guzz是一套用于多数据库编程的ORM框架,实现在一套系统中轻松使用多台数据库。在这次更新中,您可以像配置Hibernate一样配置Guzz,让Spring进行声明式的全局事务管理。Guzz Spring事务支持标准Spring事务的所有配置,除了嵌套事务和JTA。  阅读全文
posted @ 2011-11-24 08:43 深蓝色心情 阅读(1462) | 评论 (1)编辑 收藏

2011年11月18日 #

功能:显示来自Gmail, Hotmail, Yahoo Mail, Facebook, 新浪微博, 百度, 网易邮箱的未读邮件和未读消息数。并可以在提示框直接点击打开查看。 

地址:https://chrome.google.com/webstore/detail/pfpnamijjddnpholapdkhokmgnfkdfpp?hl=zh_CN 


用于提高工作效率。 

效果图: 

 
posted @ 2011-11-18 11:20 深蓝色心情 阅读(8343) | 评论 (7)编辑 收藏

2011年8月30日 #


如无意外,本次更新为1.2.9最后一次更新,随后将进行下一个大版本的开发,设计新的功能,欢迎提供想法。 

guzz 1.2.9 20110830更新介绍: 

本次更新: 

1. fix issue 16. 为paramMapping 增加了type属性,用于直接指定参数类型,用于在没有java属性直接可用的情况下,为参数设置强类型。 

2. fix issue 14, 15。允许基于对象的数字类型,如Long, Integer设置和获取null值。修正了nullValue属性设置后无效的bug。 ”null”作为nullValue的保留字,用于将默认值设置为java null对象。 

3. 增加了hbm.xml中新格式的支持。新支持的格式为: 
<property name="xxx" type="java.lang.Long"> 
            <column name="col_xxxx" precision="18" scale="0" not-null="true"> 
                <comment>注释xxxx</comment> 
            </column> 
        </property> 

4. 增加了对空sql参数的检测。如 select xxx where abc in() xxx;当in 操作集合为空时,直接返回查询结果为空,避免sql错误。检测仅限于基于taglib和SeachExpression对象化的查询。 

5. 修订了配置管理中,连接池类型参数无法重复读取的bug。 

6. 工程改成了maven管理。 

什么是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/WikiHomePage?tm=6 
下载:http://code.google.com/p/guzz/downloads/list 
posted @ 2011-08-30 17:11 深蓝色心情 阅读(1665) | 评论 (1)编辑 收藏

2011年8月1日 #


基于分表和自定义表结构的日志系统。真正足够灵活的,实现成本较低的通用日志架构。 

新浪微盘下载PDF文档:http://t.cn/aY8XIT 



posted @ 2011-08-01 18:35 深蓝色心情 阅读(2422) | 评论 (2)编辑 收藏

2011年7月29日 #


guzz 1.2.9更新介绍: 

本次更新: 

1. 优化了批操作接口。增加了默认的自动提交和清除选项,使得调用者可以连续插入百万记录而不用自己计数,手工分batchSize提交。默认batchSize的大小根据数据库类型和版本,自动选择性价比最合适的;当然调用者也可以在程序中修改。 

2. 新提供Leader服务接口。Leader接口用于在集群环境下确认自己是不是主机,一个集群下一般只允许1台主机。新提供的LeaderService仅为接口,开发者需要根据自身情况选择适合自己的实现。halo-cloud工程实现了基于zookeeper的Leader服务,代码:[http://code.google.com/p/halo-cloud/source/browse/trunk/misc/com/guzzservices/version/impl/ZKLeaderElectionServiceImpl.java] 

什么是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/WikiHomePage?tm=6 
下载:http://code.google.com/p/guzz/downloads/list 

posted @ 2011-07-29 09:14 深蓝色心情 阅读(1392) | 评论 (6)编辑 收藏

2011年7月7日 #

halo-cloud介绍 

halo-cloud是什么? 

可由1到100台机器组成,并用普通编程方式扩展的小型私有云计算平台。 

halo-cloud有何价值? 

不是每个公司都像google、像淘宝、像新浪微博一样庞大,需要复杂的成千上万台机器组成的大型云计算平台,那样技术太复杂,成本太高。 

更没有多少中国公司会使用GAE、Amaze EC之类公共云平台,那样网络吃不消。 

对于普通的公司,100台以内机器组成的私有云是最好的选择。规模适中、容易开发、易于维护。 

我们对云不炒作,不报幻想,只是希望有了他,我在一个项目中写过一遍的功能代码,在以后的项目中可以直接用,不用重复开发。我也不需要什么这规范那规范,因为我从不打算开放成公共云,够我的主要项目用,速度快就好。 

总的来说:我希望我的云是个云,没有单点问题;我希望我的云可以节省我的开发和维护成本,基础功能统统只用写一遍就可以复用;我希望我的云速度快,不要有SOAP Web Service之类的问题,当我真的需要性能的时候;我希望我的云能让现有的团队来维护和继续开发,不要学一大堆东西,甚至牵扯到个人悟性上。 

这就是halo-cloud诞生的理由。私有的、小型的、简单的云计算基础服务平台。你可以直接使用上面的服务,也可以低成本的在上面开发自己的新服务。 

PS:如果你觉得云这个名字不爽,就叫他分布式基础服务吧。 

主要更新: 

1. 新增任务调度功能。项目价值:使用quartz统一实现调度,对于java项目开发基本不在需要配置调度;对于php等不具备任务功能的语言,自动获取某个页面定时执行的新功能。 

2. 新增邮件发送功能。项目价值:对于项目开发,基本不用在配置重复的配置邮件服务器,编写邮件发送代码。只需要调用一个API即可。 

3. 服务器端增加客户端感知功能。编写服务器端程序时(服务提供者),新接口允许提供者获知当前调用者的IP地址和端口,用于进行权限校验等。 

详细说明:http://code.google.com/p/halo-cloud/wiki/AboutFAQ 

项目地址:http://code.google.com/p/halo-cloud/ 





posted @ 2011-07-07 08:43 深蓝色心情 阅读(1588) | 评论 (0)编辑 收藏