深蓝色心情

过来聊聊~~~~

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

2006年1月19日 #


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

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

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


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

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

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

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

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


用于提高工作效率。 

效果图: 

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


如无意外,本次更新为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 深蓝色心情 阅读(1893) | 评论 (1)编辑 收藏


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

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



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


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

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

guzz 1.2.9 build20110511 更新介绍: 

主要更新: 

本次更新主要是解决一些bug,和调整一些设计不合理的地方。 

同时感谢 高山流水 同学,提供了Maven的配置方式。maven配置方式:http://code.google.com/p/guzz/wiki/TutorialRuntime 

计数失败回调服务 
我们用一个例子来说明。在博客系统中,经常看到博文归档。也就是对老文章,首页只把曾经发表过文章的月份列出来,网友如果要查看,就点击月份来看这个月的文章列表。一般显示为“2009年7月(3篇);2007年4月(50篇)”之类的。现在我们要讨论的是,这个功能是如何实现的?最简单的办法,按照时间count group查询。 

但对于大点的博客系统,为了提高性能,一般不会每次都用group查询,实时算出月份和文章数的统计列表。更一般的做法是,创建一个归档表,按照userId-年月-文章数记录每个月的文章发表数,每发表一篇,更新一下计数。显示时,直接单条件查询此表即可。 

但这种做法,程序设计会比较复杂。每次更新时,都要先检查这个月的记录是否存在,如果存在就更新,如果不存在就先创建再更新。而且还带来了一个性能优化问题,复杂的逻辑使得计数操作无法批量处理。如果这类情况比较多,而且混合很多其他的计数,如文章评论数,新评论数,留言数,访问次数等等,在计数处理方面的设计就会非常复杂。 

“计数失败回调服务”就是用来解决这类问题的。这个服务是guzz先前发布的计数器服务的补充。计数器服务允许程序同时对多个计数操作进行高性能更新,而“计数失败回调服务”允许计数表不需要提前生成计数项的记录,在第一次计数更新时,如果计数记录不存在,可以获得回调通知,临时创建。 

例如上面说的文章归档,也只需要按照计数器服务调用一个方法记录下操作。在计数服务服务器端,实现“计数失败回调服务”。在执行更新时,如果计数服务发现要更新的记录不存在,会自动回调“计数失败回调服务”,程序临时创建即可。这使得程序设计既简单,同时又获得事务批量提交的性能优化,减少数据库的压力。 

更多介绍请参看:http://code.google.com/p/guzz/wiki/AppendCoreService?wl=zh-Hans 


其他主要更新: 
1. 增加ExecuteService服务,使得多个异步调用服务可以共享同一个线程池。 

2. 将Demon线程的检测更改为按照Thread.isDemon()判定。新版本中,只要线程为demon,不再需要线程名称必须包含特定开头字符串,即应用ignoreDemonThreadSQL的sql输出配置。 

3. 修复了发现的bug。 

4. 发布方式上,默认将源代码放到了guzz.jar中。如果不需要源代码放入,选择thin目录下class和source分开的guzz.jar包。 

什么是guzz? 

guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大补充和延伸,并可以取代这2个东西。 

guzz主要功能与特点: 
  • 现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
  • 对于大部分场景,支持像hibernate一样的对象持久、映射和方便的增删改查,提高开发效率
  • 对于复杂场景,支持像ibatis一样,让DBA参与SQL设计的复杂数据库操作和优化,以及SQL在线调试
  • 更简洁、更好用、更容易控制的批操作接口
  • 支持在线加载与调试SQL。按照应用策略,从文件/数据库/Web Service等途径,动态提取与使用SQL语句(Dynamic SQL)
  • 支持应用程序使用大量的数据库和主从读写分离
  • 支持数据库表在多组机器间水平分布(Shard),并自动维护多组机器之间的分布式事务
  • 支持1张表按照业务规则分切成多张小表(Shadow),并支持每张小表拥有自己特殊的属性字段(Custom)
  • 支持1张大表分切后的小表,分布到不同的数据库中(VirtualDB)
  • 支持超越范式的特殊关联、非结构化数据等异构资源POJO模式的统一读取
  • 支持组件化服务(SOA)和服务相互依赖,构建企业/项目实施基础平台
  • 提供面向对象的数据库读取标签(JSP Taglib),加快页面展示层的快速变更、开发与部署
  • 支持配置管理服务器,可以使用一套软件系统对所有应用程序的配置进行统一管理
项目地址: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-05-12 17:27 深蓝色心情 阅读(1427) | 评论 (0)编辑 收藏

     摘要: 《手把手,教你编写1个可以并行运行在5台数据库上的留言板》

前言:

对于大规模系统而言,最复杂,往往也是最大的性能瓶颈,主要都产生在数据层。对于大型系统数据层的设计,主要包括缓存系统和数据库的可扩展性两方面。缓存系统比较简单,网上讨论的也比较多,方案也相对成熟,一般来说只要部署一大堆memcached之类的缓存服务器就可以解决了,扩展性也好;但对于可扩展的数据库层架构设计,通用方案较少,网上资料更是寥寥无几。

这也有情可原,现在的主流通用数据库框架,如hibernate和ibatis基本上都只支持1个系统运行在1台数据库上。对应的,基于这些框架的系统,也基本上只能运行在单台数据库上了,框架对数据库扩展性的支持几乎没有,开发者也只能被迫接受。

这篇文档,主要补充“重要”却被主流遗失的“数据库层可扩展”架构设计,让你的系统在“需要”时,可以随时通过增加机器就能最简单的解决数据库的性能瓶颈。   阅读全文
posted @ 2011-03-29 17:23 深蓝色心情 阅读(2383) | 评论 (0)编辑 收藏

今天,经过一个多月的线上运行,我们很荣幸的发布guzz 1.2.9分布式切表功能。分布式切表是指将一张大表分切成N张小表,并将这些小表储存到不同的数据库(机器)中,从而实现数据的分散存储和分散查询。 

对于大型系统和数据规模较大的系统,分布式切表提供了非常好的解决方案,有效的解决了大数据分散存储、查询、归档和维护等诸多的问题。但市面上流行的数据层框架,对于此特性几乎无人涉及。guzz首次将这种技术做成了通用框架级别,更全面的提供“一站式数据层解决方案”。 

guzz 1.2.9 build20110209 更新介绍: 

分布式切表: 

guzz特性。 

分布式切表以guzz的Shadow Table为基础。在Shadow Table的基础上,通过配置完成,应用不需要修改现有代码即可完成小表的分布式存储。具体请参看:http://code.google.com/p/guzz/wiki/TutorialVirtualDB?wl=zh-Hans 

至此,guzz已经通过6个层面完成了全面的数据分切支持: 


支持记录SQL执行时间: 

在打印执行的SQL和SQL参数的同时,通过 调试服务(DebugService) 两个新的参数允许打印出sql执行所花费的时间,并且允许控制只打印执行时间超过一定时长的sql语句。时间单位为纳秒。 

具体请参看:http://code.google.com/p/guzz/wiki/AppendCoreService?wl=zh-Hans 

支持hbm.xml的package属性: 

支持配置hbm.xml的类名时,指定package。用于支持某些hibernate工具自动生成的配置文件。 

其他: 

1. 更改LogService为InsertQueueService; 

2. 修复了几个bug。 

什么是guzz? 

guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大补充和延伸,并可以取代这2个东西。 

guzz主要功能与特点: 
  • 现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
  • 对于大部分场景,支持像hibernate一样的对象持久、映射和方便的增删改查,提高开发效率
  • 对于复杂场景,支持像ibatis一样,让DBA参与SQL设计的复杂数据库操作和优化,以及SQL在线调试
  • 更简洁、更好用、更容易控制的批操作接口
  • 支持在线加载与调试SQL。按照应用策略,从文件/数据库/Web Service等途径,动态提取与使用SQL语句(Dynamic SQL)
  • 支持应用程序使用大量的数据库和主从读写分离
  • 支持数据库表在多组机器间水平分布(Shard),并自动维护多组机器之间的分布式事务
  • 支持1张表按照业务规则分切成多张小表(Shadow),并支持每张小表拥有自己特殊的属性字段(Custom)
  • 支持1张大表分切后的小表,分布到不同的数据库中(VirtualDB)
  • 支持超越范式的特殊关联、非结构化数据等异构资源POJO模式的统一读取
  • 支持组件化服务(SOA)和服务相互依赖,构建企业/项目实施基础平台
  • 提供面向对象的数据库读取标签(JSP Taglib),加快页面展示层的快速变更、开发与部署
  • 支持配置管理服务器,可以使用一套软件系统对所有应用程序的配置进行统一管理
项目地址:http://code.google.com/p/guzz/ 
文档:http://code.google.com/p/guzz/wiki/WikiHomePage?tm=6 
下载:http://code.google.com/p/guzz/downloads/list 

下一个build更新计划: 

  • 做什么哪?开源一个云服务项目?
  • 辅助诊断类功能?

posted @ 2011-02-10 15:31 深蓝色心情 阅读(2037) | 评论 (0)编辑 收藏

     摘要: 100%原创功能,目前尚未发现有任何框架实现到这种级别的大规模系统设计要求特性。

设计与使用方便,几乎为外挂式,不需要更改现有系统代码。  阅读全文
posted @ 2011-01-18 20:38 深蓝色心情 阅读(1771) | 评论 (0)编辑 收藏

GuzzServices的PHP客户端实现,已经实现了:IP反查,敏感词审查,以及从html代码中抽取纯文本和图片。

需要php服务器支持json,配置方式:http://php.net/manual/en/book.json.php

客户端的使用方式请参看examples.php中的例子。

php客户端下载


posted @ 2010-12-26 21:09 深蓝色心情 阅读(1550) | 评论 (0)编辑 收藏

guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大的延伸,并可以取代这2个东西。 

guzz主要功能与特点: 
  • 现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
  • 支持像hibernate一样的对象化持久、映射和方便的增删改查
  • 支持像ibatis一样,让dba参与sql设计的复杂数据库操作和优化
  • 支持在线加载与调试SQL。按照应用策略,从文件/数据库/Web Service等途径,动态提取与使用SQL语句(Dynamic SQL)
  • 支持应用程序使用大量的数据库和主从读写分离
  • 支持超越范式的特殊关联、非结构化数据等异构资源的统一管理
  • 支持数据表在多组机器间水平分布(Shard),并自动维护多组机器之间的分布式事务
  • 支持1张表按照业务规则分切成多张小表(Shadow),并支持每张小表拥有自己特殊的属性字段(Custom)
  • 支持组件化服务(Service),以及服务间依赖,帮助构建企业/项目实施基础平台
  • 提供面向对象的数据库读取标签(JSP Taglib),加快页面展示层的快速变更、开发与部署
  • 支持配置管理服务器,可以使用一套软件系统对所有应用程序的配置进行统一管理
项目地址:http://code.google.com/p/guzz/ 
文档:http://code.google.com/p/guzz/wiki/WikiHomePage?tm=6 
下载:http://code.google.com/p/guzz/downloads/list 

guzz 1.2.9 build20101021 更新介绍: 

增强服务,支持服务间相互依赖 

服务在配置时,通过dependsOn属性设置依赖的服务,guzz进行IOC注入。例如您将一套通信协议设计成一个通信服务,当其他服务需要进行通信时,直接依赖通信服务完成远程调用或数据传送。 

为了说明服务的价值与使用方式,guzz设计了一些常用的基础服务,供测试或者直接使用。使用时,一般只需要几行代码,就可以完成本来的一个大模块。限于篇幅,请参看:http://www.guzzservices.com/category/developer-guide/ 

guzzservices.com中目前提供的服务包括:可以主动推送修改后配置项的系统配置管理,敏感词管理与文字过滤服务,以及通过IP查询地理位置服务。后续还将增加一些。试一下,就能发现guzz服务带来的开发与维护优势。 

服务以及注入文档:http://code.google.com/p/guzz/wiki/TutorialService?wl=zh-Hans#配置服务: 

新增random主键生成器(原创): 

random主键用于解决guid和uuid产生的主键在较短时间内比较类似,虽然不会重复,但容易被猜出来的问题。对于某些应用场景,如对外API的key,需要确保无法被猜出,这时就需要random主键策略。 

random主键生成一段随机字符串,由数字和小写字母组成。随机串长度默认为32,可以通过length属性进行调整。 

其他: 

1. 修复了一些bug; 

2. 完成英文版文档翻译。 

下一个build更新计划: 

  • 支持将一张大表分切到多台机器上。
  • 其他
posted @ 2010-10-25 08:17 深蓝色心情 阅读(1370) | 评论 (0)编辑 收藏

服务已经切换至guzzservices.com,并更改了API。请使用新的接口,具体参看:http://www.guzzservices.com/2010/man_ip_service/

使用时,需要将guzz升级到1.2.9以及以上版本。

如果您已经在使用,请尽快切换。新的地址应该不会在变化。非常抱歉进行了服务变化。


posted @ 2010-10-21 20:08 深蓝色心情 阅读(1620) | 评论 (2)编辑 收藏

最近讨论db shard的帖子比较多,感觉很多都是在参考hibernate shard的思路,但hibernate分表真的那么好吗?我觉得它最少有2个问题: 

1. 改成shard后,代码的API调用要变。代码改动很大。 
2. 设计很复杂,不清晰,逻辑关系难以理解。 

hibernate shard基本上就是为了shard而对hibernate做的增增补补,凑合用还行,根本不具备设计上的参考价值。 

对数据库分切方面,到目前为止,我觉得还是guzz的设计最清晰,如果我说的不对,欢迎理性讨论。不管您是否使用guzz,但是guzz在数据库分切方面的设计,对于清晰的设计模式,比hibernate shard更具有借鉴意义。 

guzz垂直切分 

垂直切分是指将不同的表分别存储到不同的数据库中。guzz默认配置级支持,不需要写任何代码,可以在任何时候,在需要时,将每张表存储到自己单独的一组服务器上,应该说是垂直分切的极限了。而且设计上,无论什么时候怎么分切,都不需要你改动代码。开发时你可以让所有表在一个库上;部署时,分到多个库上;以后业务增加了,再更加分散的放。 

垂直分切简单配置方式: 

1. 声明你要用多少台数据库,数据库之间什么关系。 

Xml代码 
  1. <dialect class="org.guzz.dialect.H2Dialect"></dialect>  
  2. <dialect name="mysql5dialect" class="org.guzz.dialect.Mysql5Dialect" />  
  3. <dialect name="oracle10gdialect" class="org.guzz.dialect.Oracle10gDialect" />  
  4.   
  5. <tran>  
  6.         <dbgroup name="default" masterDBConfigName="masterDB" />  
  7.         <dbgroup name="mysql" masterDBConfigName="masterDB" slaveDBConfigName="mysqlSlaveDB" dialectName="mysql5dialect" />  
  8.         <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" />  
  9. </tran>   

这里我们声明了3组数据库,而且数据库类型还不一样。 

2. 对每张表,配置应该存储到那个库里 

Xml代码 
  1. <a-business dbgroup="default" name="filterWord" class="com.guzzservices.business.FilterWord" />  
  2. <a-business dbgroup="mysql" name="filterWordGroup" class="com.guzzservices.business.FilterWordGroup" />  
  3. <a-business dbgroup="oracle" name="configuration" class="com.guzzservices.business.Configuration" />  

简单的配置,将三个对象分别存储到3台不同的数据库中,完成垂直分切。 

guzz水平切表 

水平切表是指将一张大表,分切成许多小表。guzz的设计是当需要水平分表时,原先代码不变,为每个需要分切的表编写一个分表策略类,配置到系统中。然后在调用前,声明分表策略即可。 
  
  整个过程只需要新写一个类,在调用出增加一行代码即可,对原始系统入侵非常小,风险可控。 

  流程总比hibernate shard要清晰很多,具体可以看http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans 


数据库主从分离 

从垂直分切部分可以看到,guzz也是配置性的原生支持读写分离。如果需要增加从数据库,可以随时加上,不需要改任何代码。不需要改动代码,而且配置也不复杂,应该算是设计上的极限了吧? 

你只需要在dbgroup中增加一个属性“slaveDBConfigName”,然后在一个properties文件中加上所有你需要的从数据库连接池配置即可,从数据库可以有许多台。 

这个hibernate shard根本就没有涉及到。而且guzz允许程序控制读写库选取,和proxy模式的中间件路由各有优势,毕竟更加容易控制。如果你做过内容提前审核再允许发布的系统,就会明白proxy中间件解决不了全部问题,有些读操作不允许延迟,只能读主库,而是也是读事务,proxy中间件会很尴尬。 

异构数据库 

这个hibernate以及ibatis之类的更没有了。而且也是对应用透明的,你可以随时选择增加一种数据库,然后把某些表放到上面,如增加一个H2做应用端缓存数据库,自己完成类似Timesten + oracle的架构。 

配置方式在上面的垂直分切小节也可以看到。 

数据库连接池配置 

随着表垂直和水平切分的进行,数据库会越来越多,数据源配置也会越来越多。guzz的设计是配置分组管理,类似Mysql的配置文件。每个数据源配置都在一个组内,无论增加多少都清晰了然,不会名字相互冲突。 

示例: 
Properties代码 
  1. [masterDB]  
  2. guzz.identifer=blogMasterDB  
  3. guzz.IP=localhost  
  4. guzz.maxLoad=120  
  5. driverClass=com.mysql.jdbc.Driver  
  6. jdbcUrl=jdbc:mysql://localhost:3306/blog?useUnicode=true&amp;characterEncoding=UTF-8&amp;useServerPrepStmts=true  
  7. user=root  
  8. password=root  
  9. acquireIncrement=10  
  10. idleConnectionTestPeriod=60  
  11.   
  12. [updateMasterDB]  
  13. guzz.identifer=incUpdateDB1  
  14. guzz.IP=localhost  
  15. guzz.maxLoad=20  
  16. driverClass=com.mysql.jdbc.Driver  
  17. jdbcUrl=jdbc:mysql://localhost:3306/guzzSlowUpdate?useUnicode=true&amp;characterEncoding=UTF-8  
  18. user=slowupdate  
  19. password=slowupdate  
  20. acquireIncrement=10  
  21. idleConnectionTestPeriod=60  
  22.   
  23. [logMasterDB]  
  24. ....  

如果一些数据库对某些连接池支持更好,guzz设计上还允许为不同的数据源指定不同的连接池实现。 

如果您需要分表,还是放弃hibernate shard或ibatis的设计模式吧,哪些只是临时拼凑出来的东西,设计上根本就不怎么样! 
posted @ 2010-10-18 21:02 深蓝色心情 阅读(4272) | 评论 (5)编辑 收藏

     摘要: 服务地址和接口已经更改,新的使用手册在:http://www.guzzservices.com/2010/man_ip_service/ 一.功能介绍  通过传入的IP地址,返回IP所在的地理位置。如传入“58.16.209.19”,返回“贵州省六盘水市 ”。  返回的地理位置又分为3种精确度,程序可以按照自身需要选...  阅读全文
posted @ 2010-06-22 11:59 深蓝色心情 阅读(3496) | 评论 (9)编辑 收藏


guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大的延伸,并可以取代这2个东西。 

guzz主要功能与特点: 
  • 现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
  • 支持像hibernate一样的对象化持久、映射和方便的增删改查
  • 支持像ibatis一样,让dba参与sql设计的复杂数据库操作和优化
  • 支持在线加载与调试SQL。按照应用策略,从文件/数据库/Web Service等途径,动态提取与使用SQL语句(Dynamic SQL)
  • 支持应用程序使用大量的数据库和主从读写分离
  • 支持超越范式的特殊关联、非结构化数据等异构资源的统一管理
  • 支持数据表在多组机器间水平分布(Shard),并自动维护多组机器之间的分布式事务
  • 支持1张表按照业务规则分切成多张小表(Shadow),并支持每张小表拥有自己特殊的属性字段(Custom)
  • 支持组件化服务(SOA),构建企业/项目实施基础平台
  • 提供面向对象的数据库读取标签(JSP Taglib),加快页面展示层的快速变更、开发与部署
  • 支持配置管理服务器,可以使用一套软件系统对所有应用程序的配置进行统一管理
项目地址:http://code.google.com/p/guzz/ 
文档:http://code.google.com/p/guzz/wiki/WikiHomePage?tm=6 
下载:http://code.google.com/p/guzz/downloads/list 

1.2.8 更新介绍: 

支持(JPA)annotation 

支持按照JPA规范的annotation进行对象映射声明,同时为了实现guzz特有的功能,对annotation进行了扩展。扩展方式与hibernate类似,如果看到与hibernate annotation名字相同的注解,含义和用法也基本相同。 

更多介绍请参看使用手册: 
Guzz Annotation使用帮助:http://code.google.com/p/guzz/wiki/TutorialHbmAnnotation 

Guzz Annotation参考手册:http://code.google.com/p/guzz/wiki/AppendJPAAnnotation 

支持动态管理SQL: 

动态SQL(Dynamic SQL)不是指应用程序动态的拼接SQL语句,动态SQL是指应用程序可以动态的获取配置好的SQL语句。在获取的过程中,SQL语句如何管理,由应用系统自身决定。 

换句话说,在ibatis中,SQL语句配置到ibatis.xml文件中,在guzz中,配置到guzz.xml中。但当配置完成后,在系统运行期间这些SQL都是不能变动的,如果需要添加1个或者修改优化1个SQL语句,必须重启应用才能生效。而动态SQL允许应用系统动态的管理(添加/修改/优化/删除)sql语句以及查询结果到对象的映射关系(ORM),对于SQL的变更不再需要重启应用系统,以简化维护与应对需求变化。 

动态SQL主要有两种应用场景:SQL优化和动态数据源。具体介绍请参看:http://code.google.com/p/guzz/wiki/TutorialDynamicSQLService 

使用动态SQL的应用设计架构参考:http://guzz.javaeye.com/blog/675955 

改进远程服务设计: 

增加对hessian, burlap协议的支持。目前guzz内置支持phprpc, hessian, burlap三种协议进行RPC远程调用。使用时,三种协议可以透明替换,类似spring对RMI类协议的封装。具体介绍请参看:http://code.google.com/p/guzz/wiki/TutorialFutureService 

增加枚举类型与类型参数化支持: 

按照TopLink的模式,支持JDK5 enum。Enum在使用时和普通类型一样,不需要实现特殊的接口(hibernate要求实现接口)。Enum支持通过JPA的Enumeration注释声明,也支持在hbm.xml中通过xml定义。通过xml的定义方式参看:http://code.google.com/p/guzz/wiki/TutorialHbmXml 

类型参数化为guzz的特殊功能,用于处理动态SQL参数和Jsp Taglib条件参数时,将String类型自动转换成需要的数据类型。参数化类型主要为日期和枚举。详细介绍:http://code.google.com/p/guzz/wiki/TutorialHbmXml 

增加对数据库保留字的支持: 

在定义数据库列名时,可以用`(ESC下面的键)将列名引起来,避免字段名称与数据库保留字冲突。此功能与hibernate提供的处理保留字方法相同,但guzz只支持字段,不支持`表名`。 

增加对Microsoft SQL Server的支持(未测试): 

参考hibernate实现了一个SQL Server 2000 & 2005的dialect,不支持分页。没有测试过。Dialect实现类:org.guzz.dialect.MSSQLDialect 

Guzz已经能够支持的数据库和数据类型请参看: 
http://code.google.com/p/guzz/wiki/TutorialGuzzXml 

其他: 

1. 文档进行了大范围的补充和更新; 

2. 修复了所有已经发现的bug。 

下一版本计划: 

  • 增加对spring事务的兼容。
  • 设计一些常见的服务,推广guzz基础服务理念。
posted @ 2010-06-22 08:51 深蓝色心情 阅读(1470) | 评论 (1)编辑 收藏

如何不用写java代码来完成开发? 

对于大部分的产品和项目来说,页面变化是非常头痛的事情。每次小功能上线,新客户到来,都需要进行定制改造,不断的开发维护。每次开发一方面要改动页面,一方面要改动服务器代码,然后部署。而借助动态数据源,可以不用开发后端应用,直接完成功能开发。 

新功能开发时,只需要定义需要的数据格式和获取方法,如通过xml上传1个sql语句,系统根据sql语句自动提取数据并转成通用的格式。开发过程中,后台java开发部分只是写好sql并且上传,这样前台通过某一个servlet可以动态的读取执行sql,并将结果按照json返给前端,以后所有的开发只需要前端做ajax实现页面即可。 

完整业务流程如下: 

1. 用户在前端操作,如需要读取经济类图书。 

2. 前端js判断是什么操作,然后发送ajax请求到:http://services.guzz.org/commonServlet?id=f2354239sfASASFASfasf6&catId=47&keyword=jingji..... 

3. 服务器端有一个类似dispatcher-servlet的东西(我们这儿的commonServlet),拦截请求,根据id知道加载数据需要执行名称为f2354239sfASASFASfasf6的sql文件,执行时需要参数:catId=47和keyword=jingji 

4. commonServlet从文件系统中读取f2354239sfASASFASfasf6.xml文件(这个文件在一个隐藏的目录下,从浏览器是不能直接获取到的;集群环境会存放在集中存储上),解析sql以及对象映射ORM。 

5. commonServlet打开数据库连接,根据sql构造查询语句,将第一步传入的参数全部作为命名参数传给查询语句,执行查询。 

6. commonServlet把查询的ResultSet根据ORM转成java类,再转成json,返回前台。 

7. 前台根据json构造出页面并展示。结束流程。 

在整个过程中,有2个关键步骤,一是动态加载SQL并进行ORM映射,一是自动进行sql所需要参数的类型转换和匹配,进行命名查询。如果系统规模较大,还需要解决查询时分库分表的问题。对于这种sql使用方式,由于在系统上线时,并不知道以后会用哪些sql语句,我们称作动态SQL。 

实现方式: 

步骤1. 实现servlet。定义一个普通的servlet,或者jsp,或者webwork/spring action,接收参数,获取到sql的id,以及所有传入的参数,然后转入处理类处理。处理完成后,将返回结果转成json返回前端。 

步骤2. 实现动态SQL加载与查询。处理类根据id加载sql并执行,返回数据库查询结果。guzz 1.2.8 beta2提供了动态SQL服务,根据此服务可以直接实现此功能。详细说明:http://code.google.com/p/guzz/wiki/TutorialDynamicSQLService 

好处: 

实现以后,基本上后台开发就会很稳定很稳定了,大部分的工作只是前端做页面。可以大幅度的降低开发成本,提高开发进度。 

上面的实现是以上传文件来定义和管理sql,也可以通过数据库来管理。这样管理起来更加简单。 

如果使用guzz作为动态SQL提供者,可以自动获得命名查询,类型自动匹配(转成枚举类型都可以),分库,自动分切表,自定义属性表等附加支持。

啧啧~~ 

posted @ 2010-05-27 14:52 深蓝色心情 阅读(3002) | 评论 (5)编辑 收藏


guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大的延伸,并可以取代这2个东西。 

guzz主要功能与特点: 
  • 现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
  • 支持像hibernate一样的对象化持久、映射和方便的增删改查
  • 支持像ibatis一样,让dba参与sql设计的复杂数据库操作和优化
  • 支持在线加载与调试SQL。按照应用策略,从文件/数据库/Web Service等途径,动态提取与使用SQL语句(Dynamic SQL)
  • 支持应用程序使用大量的数据库和主从读写分离
  • 支持超越范式的特殊关联、非结构化数据等异构资源的统一管理
  • 支持数据表在多组机器间水平分布(Shard),并自动维护多组机器之间的分布式事务
  • 支持1张表按照业务规则分切成多张小表(Shadow),并支持每张小表拥有自己特殊的属性字段(Custom)
  • 支持组件化服务(SOA),构建企业/项目实施基础平台
  • 提供面向对象的数据库读取标签(JSP Taglib),加快页面展示层的快速变更、开发与部署
  • 支持配置管理服务器,可以使用一套软件系统对所有应用程序的配置进行统一管理
项目地址:http://code.google.com/p/guzz/ 
文档:http://code.google.com/p/guzz/wiki/WikiHomePage?tm=6 

1.2.8 beta2更新介绍: 

支持动态管理SQL: 

动态SQL(Dynamic SQL)不是指应用程序动态的拼接SQL语句,动态SQL是指应用程序可以动态的获取配置好的SQL语句。在获取的过程中,SQL语句如何管理,由应用系统自身决定。 

换句话说,在ibatis中,SQL语句配置到ibatis.xml文件中,在guzz中,配置到guzz.xml中。但当配置完成后,在系统运行期间这些SQL都是不能变动的,如果需要添加1个或者修改优化1个SQL语句,必须重启应用才能生效。而动态SQL允许应用系统动态的管理(添加/修改/优化/删除)sql语句以及查询结果到对象的映射关系(ORM),对于SQL的变更不再需要重启应用系统,以简化维护与应对需求变化。 

动态SQL主要有两种应用场景:SQL优化和动态数据源。具体介绍请参看:http://code.google.com/p/guzz/wiki/TutorialDynamicSQLService 

改进远程服务设计: 

增加对hessian, burlap协议的支持。目前guzz内置支持phprpc, hessian, burlap三种协议进行RPC远程调用。使用时,三种协议可以透明替换,类似spring对RMI类协议的封装。具体介绍请参看:http://code.google.com/p/guzz/wiki/TutorialFutureService 

增加枚举类型与类型参数化支持: 

按照TopLink的模式,支持JDK5 enum。Enum在使用时和普通类型一样,不需要实现特殊的接口(hibernate要求实现接口)。Enum支持通过JPA的Enumeration注释声明,也支持在hbm.xml中通过xml定义。通过xml的定义方式参看:http://code.google.com/p/guzz/wiki/TutorialHbmXml 

类型参数化为guzz的特殊功能,用于处理动态SQL参数和Jsp Taglib条件参数时,将String类型自动转换成需要的数据类型。参数化类型主要为日期和枚举。详细介绍:http://code.google.com/p/guzz/wiki/TutorialHbmXml 

增加对数据库保留字的支持: 

在定义数据库列名时,可以用`(ESC下面的键)将列名引起来,避免字段名称与数据库保留字冲突。此功能与hibernate提供的处理保留字方法相同,但guzz只支持字段,不支持`表名`。 

增加对Microsoft SQL Server的支持(未测试): 

参考hibernate实现了一个SQL Server 2000 & 2005的dialect,不支持分页。没有测试过。Dialect实现类:org.guzz.dialect.MSSQLDialect 

Guzz已经能够支持的数据库和数据类型请参看: 
http://code.google.com/p/guzz/wiki/TutorialGuzzXml 

应用示例说明: 

http://code.google.com/p/guzz/wiki/TutorialDynamicSQLService 

下一版本计划: 

  • 修复发现的bug。
  • 设计一些常见的服务,推广guzz基础服务理念。
posted @ 2010-05-26 10:13 深蓝色心情 阅读(1771) | 评论 (2)编辑 收藏

     摘要: guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大的延伸,并可以取代这2个东西。  guzz主要功能与特点:  现代大规模系统设计,技术上吸收了ibatis/hibernate的优点 支持像hibernate一样的对象化持久...  阅读全文
posted @ 2010-05-05 10:36 深蓝色心情 阅读(1459) | 评论 (0)编辑 收藏

guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大的延伸,并可以取代这2个东西。 

guzz主要功能与特点: 
  • 现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
  • 支持像hibernate一样的对象化持久、映射和方便的增删改查
  • 支持像ibatis一样,让dba参与sql设计的复杂数据库操作和优化
  • 支持应用程序使用大量的数据库和主从读写分离
  • 支持超越范式的特殊关联、非结构化数据等异构资源的统一管理
  • 支持数据表在多组机器间水平分布(Shard),并自动维护多组机器之间的分布式事务
  • 支持1张表按照业务规则分切成多张小表(Shadow),并支持每张小表拥有自己特殊的属性字段(Custom)
  • 支持组件化服务(SOA),构建企业/项目实施基础平台
  • 提供面向对象的数据库读取标签(JSP Taglib),加快页面展示层的快速变更、开发与部署
  • 支持配置管理服务器,可以使用一套软件系统对所有应用程序的配置进行统一管理
项目地址:http://code.google.com/p/guzz/ 
文档:http://www.guzz.org/wiki/GuzzGuide 

1.2.7正式版 更新介绍: 

  • 支持表分切。允许同一对象按照业务规则,分别存储在不同的表中。如新闻评论:新闻频道的评论存放在 tb_c1,娱乐:tb_c2,体育tb_c3,其他:tb_c4,满足同类在线数据的数据表平行扩展需要。表分切命名为:Shadow Table。

  • 支持自定义属性表。允许分切后的每张小表拥有自己的动态对象属性和字段。如购物网站中:商品对象拥有统一的名称、价格、编号、评分等,但不同的商品可能有自己特殊的属性,如图书拥有ISBN和出版社作者,服装拥有尺码、颜色、款式等等。自定义属性允许程序只定义1个商品域对象,然后通过自定义属性和切表,将每1种特定的商品分切到1张自己特殊的表中,这张表同时拥有商品通用的字段以及这种商品自己的字段,查询时可以按照特殊字段直接在数据库中进行关系查询。在guzz中,自定义属性的定义允许存储到数据库中,像普通对象一样动态生成和管理,不用配置复杂的xml。自定义属性命名为:Custom Table。

  • 增加并行任务支持。用于多个远程服务同步的调用,降低等待时间。

  • 增加hilo和seqhilo主健生成策略。至此,hibernate支持的常见主健生成策略,guzz都支持了。

  • 增加外挂环境接口。如果在spring中启动,允许在guzz中获取spring定义的bean。
应用示例说明: 

本次更新有很多新概念需要介绍,因此篇幅较长。详细的示例和说明请参看: 

表分切:http://www.guzz.org/wiki/GuzzShadow 

自定义属性表(基于表分切):[url]http://www.guzz.org/wiki/GuzzCustomTable [/url] 

并行任务执行(基于服务):http://www.guzz.org/wiki/GuzzFutureService 

主健生成策略:http://www.guzz.org/wiki/GuzzHbm 

下一版本计划: 

  • 数据库自动分库支持。允许同一张表,分散在多台数据库中。
  • 提供更多对服务的支持。
  • 探索SASS(软件就是服务)的数据层模型。
  • 其他
posted @ 2010-04-09 14:55 深蓝色心情 阅读(1572) | 评论 (1)编辑 收藏

我们主要是web应用,web规模也不能确定,有可能一天几千万甚至上亿的PV,也有可能根本没人用。最初设计guzz的目的就是让大型网站和小型网站一样设计编写,因为谁也不知道这个应用上去以后有多少人用,同时解决系统被要求页面天天改来该去的问题。 

使用guzz以来的效果: 

1. 框架性能上没有看得出的快慢区别。我觉得不会比hibernate和biatis慢,我看过他们的一些代码,流程挺复杂的。guzz很简单,整个持久化过程需要转手的类至少要比这两个少很多。 

2. 以前我们用hibernate较多,一般数据库设计就是一个库,读写全部做。现在在设计时大家脑子里面直接就是分出3个数据库(可能部署在1台mysql上)--业务主库,临时信息库,日志库,然后把表分到不同的库中。然后数据库安装时直接主从安装,主从使用。虽然看起来库复杂了,但程序上没有任何成本代价,基本上已经形成一种设计流程。这种模式感觉可以作为最佳实践。 

3. 编程上,一开始开发人员还是建个spring action类 + 在dao和manager中增加需要的方法 + 修改dispatcher-servlet.xml配置映射 + jsp实现view。但现在很多功能都是直接jsp,用taglib直接读库,基本上后台的读数据库操作页面已经看不到action的影子了。java代码比先前的工程,同样的功能少了大概60%-70%。 

4. 我们的系统一般后台功能比较复杂,以往编辑要改点东西大家都很郁闷。不过现在抵制少了很多,基本上就是改改jsp或者在复制1个新的jsp改改,然后传到服务器上,一大堆集群机器的重启工作都免了,无论是开发还是部署都很省事。和php差不多。 

guzz1.2.7分表和自定义表的应用实例: 

我们有1套调查系统,使用了这项技术,也是第一个线上测试。每个调查都不太一样,需要网友填一些东西,需要填什么,填的个数类型都不定。一个调查进行过程中,或者结束后要求对数据进行统计报表。统计的内容可能也包括那些自定义的填空题。 

在1.2.7之前,我们解决方案是:将所有自定义的调查项,按照key-value生成一个xml字符串,存储到数据库大字段中(Mysql text字段)。需要统计时,根据mysql5.1对xml支持的新特性使用ExtraValue函数解析这个xml生成一个新表(create table xxxx select ExtraValue(xx) as a, .....from 主调查记录表),然后在根据新的xxxx表统计。每次都要手工来弄,非常繁琐。 

1.2.7,使用切表和自定义属性后,现在的解决方案:每次创建投票并建立好自定义调查项(自定义调查项存储在数据库中),根据这些自动生成一个mysql create table的语句,创建好需要的表。在配置CustomTableView动态的映射用户提交的数据存储到对应的表中。完全自动,后续处理简化了很多。 

而且由于整个过程是实时的,以前的过程是手工的,所以很多线上的报表功能也可以开发了。开发也非常简单,我们用guzz jsp tablib直接读库,像操作普通java属性一样操作自定义属性,一个类型的表报1个jsp。特殊调查的特殊报表也就是往服务器上放1个特殊处理的jsp,应用都不用重启,非常方便。 

guzz1.2.7分表和自定义表的下一个应用计划: 

这是一个计划,还没有做,不过我们准备很快就开始做。 

我们的所有系统对日志都有要求,日志必须记录!但日志的开发很烦人,全是没有技术含量的重复工作。我们准备开发一个日志服务,所有系统以后就不用开发日志了,直接使用这个服务。日志服务分为服务器端和客户端。 

服务器端: 

一个标准的java web系统,有日志数据库,用来存储所有系统的日志信息,并提供查询和统计等界面。如果有人需要查日志,就到这个系统来查。 

服务器端有1个应用数据库,用来创建和管理授权的应用系统。1个新的应用上线的时候,在这里创建一个应用和他的授权码,然后录入他的个性日志字段和数据类型(类似上面提到调查的个性选项),服务器自动在数据库中给他创建1个日志表,用来存储这个应用的日志数据。我们准备按季度分表,让每个日志表1个季度分成1张子表。 

客户端: 

实现一个标准的guzz service,提供日志插入接口 
Java代码 
  1. public void log(UserLog log) ;  

每个系统开发时,将日志服务的jar包放到工程中,并在guzz.xml中声明此服务,代码直接调用就OK了。 

这样以后就不用为每个系统开发日志管理模块了。并且还能获取到统计某一个用户在所有系统中活动记录的额外增强(例如我们可以在服务器端将日志记录两份,一份按应用系统,一份按操做者记录)~~ 

posted @ 2010-04-09 14:52 深蓝色心情 阅读(3448) | 评论 (0)编辑 收藏

提高 Linux 上 socket 性能

加速网络应用程序的 4 种方法

developerWorks
 

未显示需要 JavaScript 的文档选项


 


级别: 中级

M. Tim Jones ,资深软件工程师,Emulex

2006 年 2 月 13 日

使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过 Internet 在全球范围内进行通信。与其他 API 一样,您可以通过一些方法使用 Sockets API,从而提高 Socket 的性能,或者限制 Socket 的性能。本文探索了 4 种使用 Sockets API 来榨取应用程序的最大性能并对 GNU/Linux® 环境进行优化从而达到最好结果的方法。

在开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序。本文内容包括对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化。

为了能够开发性能卓越的应用程序,请遵循以下技巧:

  • 最小化报文传输的延时。
  • 最小化系统调用的负载。
  • 为 Bandwidth Delay Product 调节 TCP 窗口。
  • 动态优化 GNU/Linux TCP/IP 栈。

技巧 1. 最小化报文传输的延时

在通过 TCP socket 进行通信时,数据都拆分成了数据块,这样它们就可以封装到给定连接的 TCP payload(指 TCP 数据包中的有效负荷)中了。TCP payload 的大小取决于几个因素(例如最大报文长度和路径),但是这些因素在连接发起时都是已知的。为了达到最好的性能,我们的目标是使用尽可能多的可用数据来填充每个报文。当没有足够的数据来填充 payload 时(也称为最大报文段长度(maximum segment size) 或 MSS),TCP 就会采用 Nagle 算法自动将一些小的缓冲区连接到一个报文段中。这样可以通过最小化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞问题。

尽管 John Nagle 的算法可以通过将这些数据连接成更大的报文来最小化所发送的报文的数量,但是有时您可能希望只发送一些较小的报文。一个简单的例子是 telnet 程序,它让用户可以与远程系统进行交互,这通常都是通过一个 shell 来进行的。如果用户被要求用发送报文之前输入的字符来填充某个报文段,那么这种方法就绝对不能满足我们的需要。

另外一个例子是 HTTP 协议。通常,客户机浏览器会产生一个小请求(一条 HTTP 请求消息),然后 Web 服务器就会返回一个更大的响应(Web 页面)。

解决方案

您应该考虑的第一件事情是 Nagle 算法满足一种需求。由于这种算法对数据进行合并,试图构成一个完整的 TCP 报文段,因此它会引入一些延时。但是这种算法可以最小化在线路上发送的报文的数量,因此可以最小化网络拥塞的问题。

但是在需要最小化传输延时的情况中,Sockets API 可以提供一种解决方案。要禁用 Nagle 算法,您可以设置 TCP_NODELAY socket 选项,如清单 1 所示。


清单 1. 为 TCP socket 禁用 Nagle 算法

int sock, flag, ret;

/* Create new stream socket */
sock = socket( AF_INET, SOCK_STREAM, 0 );

/* Disable the Nagle (TCP No Delay) algorithm */
flag = 1;
ret = setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );

if (ret == -1) {
  printf("Couldn't setsockopt(TCP_NODELAY)\n");
  exit(-1);
}

提示:使用 Samba 的实验表明,在从 Microsoft® Windows® 服务器上的 Samba 驱动器上读取数据时,禁用 Nagle 算法几乎可以加倍提高读性能。



回页首


技巧 2. 最小化系统调用的负载

任何时候通过一个 socket 来读写数据时,您都是在使用一个系统调用(system call)。这个调用(例如 readwrite)跨越了用户空间应用程序与内核的边界。另外,在进入内核之前,您的调用会通过 C 库来进入内核中的一个通用函数(system_call())。从 system_call() 中,这个调用会进入文件系统层,内核会在这儿确定正在处理的是哪种类型的设备。最后,调用会进入 socket 层,数据就是在这里进行读取或进行排队从而通过 socket 进行传输的(这涉及数据的副本)。

这个过程说明系统调用不仅仅是在应用程序和内核中进行操作的,而且还要经过应用程序和内核中的很多层次。这个过程耗费的资源很高,因此调用次数越多,通过这个调用链进行的工作所需要的时间就越长,应用程序的性能也就越低。

由于我们无法避免这些系统调用,因此惟一的选择是最小化使用这些调用的次数。幸运的是,我们可以对这个过程进行控制。

解决方案

在将数据写入一个 socket 时,尽量一次写入所有的数据,而不是执行多次写数据的操作。对于读操作来说,最好传入可以支持的最大缓冲区,因为如果没有足够多的数据,内核也会试图填充整个缓冲区(另外还需要保持 TCP 的通告窗口为打开状态)。这样,您就可以最小化调用的次数,并可以实现更好的整体性能。



回页首


技巧 3. 为 Bandwidth Delay Product 调节 TCP 窗口

TCP 的性能取决于几个方面的因素。两个最重要的因素是链接带宽(link bandwidth)(报文在网络上传输的速率)和 往返时间(round-trip time) 或 RTT(发送报文与接收到另一端的响应之间的延时)。这两个值确定了称为 Bandwidth Delay Product(BDP)的内容。

给定链接带宽和 RTT 之后,您就可以计算出 BDP 的值了,不过这代表什么意义呢?BDP 给出了一种简单的方法来计算理论上最优的 TCP socket 缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据)。如果缓冲区太小,那么 TCP 窗口就不能完全打开,这会对性能造成限制。如果缓冲区太大,那么宝贵的内存资源就会造成浪费。如果您设置的缓冲区大小正好合适,那么就可以完全利用可用的带宽。下面我们来看一个例子:

BDP = link_bandwidth * RTT

如果应用程序是通过一个 100Mbps 的局域网进行通信,其 RRT 为 50 ms,那么 BDP 就是:

100MBps * 0.050 sec / 8 = 0.625MB = 625KB

注意:此处除以 8 是将位转换成通信使用的字节。

因此,我们可以将 TCP 窗口设置为 BDP 或 1.25MB。但是在 Linux 2.6 上默认的 TCP 窗口大小是 110KB,这会将连接的带宽限制为 2.2MBps,计算方法如下:

throughput = window_size / RTT

110KB / 0.050 = 2.2MBps

如果使用上面计算的窗口大小,我们得到的带宽就是 12.5MBps,计算方法如下:

625KB / 0.050 = 12.5MBps

差别的确很大,并且可以为 socket 提供更大的吞吐量。因此现在您就知道如何为您的 socket 计算最优的缓冲区大小了。但是又该如何来改变呢?

解决方案

Sockets API 提供了几个 socket 选项,其中两个可以用于修改 socket 的发送和接收缓冲区的大小。清单 2 展示了如何使用 SO_SNDBUFSO_RCVBUF 选项来调整发送和接收缓冲区的大小。

注意:尽管 socket 缓冲区的大小确定了通告 TCP 窗口的大小,但是 TCP 还在通告窗口内维护了一个拥塞窗口。因此,由于这个拥塞窗口的存在,给定的 socket 可能永远都不会利用最大的通告窗口。


清单 2. 手动设置发送和接收 socket 缓冲区大小

int ret, sock, sock_buf_size;

sock = socket( AF_INET, SOCK_STREAM, 0 );

sock_buf_size = BDP;

ret = setsockopt( sock, SOL_SOCKET, SO_SNDBUF,
                   (char *)&sock_buf_size, sizeof(sock_buf_size) );

ret = setsockopt( sock, SOL_SOCKET, SO_RCVBUF,
                   (char *)&sock_buf_size, sizeof(sock_buf_size) );

在 Linux 2.6 内核中,发送缓冲区的大小是由调用用户来定义的,但是接收缓冲区会自动加倍。您可以进行 getsockopt 调用来验证每个缓冲区的大小。

巨帧(jumbo frame)

我们还可以考虑将包的大小从 1,500 字节修改为 9,000 字节(称为巨帧)。在本地网络中可以通过设置最大传输单元(Maximum Transmit Unit,MTU)来设置巨帧,这可以极大地提高性能。

就 window scaling 来说,TCP 最初可以支持最大为 64KB 的窗口(使用 16 位的值来定义窗口的大小)。采用 window scaling(RFC 1323)扩展之后,您就可以使用 32 位的值来表示窗口的大小了。GNU/Linux 中提供的 TCP/IP 栈可以支持这个选项(以及其他一些选项)。

提示:Linux 内核还包括了自动对这些 socket 缓冲区进行优化的能力(请参阅下面 表 1 中的 tcp_rmemtcp_wmem),不过这些选项会对整个栈造成影响。如果您只需要为一个连接或一类连接调节窗口的大小,那么这种机制也许不能满足您的需要了。



回页首


技巧 4. 动态优化 GNU/Linux TCP/IP 栈

标准的 GNU/Linux 发行版试图对各种部署情况都进行优化。这意味着标准的发行版可能并没有对您的环境进行特殊的优化。

解决方案

GNU/Linux 提供了很多可调节的内核参数,您可以使用这些参数为您自己的用途对操作系统进行动态配置。下面我们来了解一下影响 socket 性能的一些更重要的选项。

/proc 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 cat 工具进行读取,或使用 echo 命令进行修改。清单 3 展示了如何查询或启用一个可调节的参数(在这种情况中,可以在 TCP/IP 栈中启用 IP 转发)。


清单 3. 调优:在 TCP/IP 栈中启用 IP 转发

[root@camus]# cat /proc/sys/net/ipv4/ip_forward
0
[root@camus]# echo "1" > /poc/sys/net/ipv4/ip_forward
[root@camus]# cat /proc/sys/net/ipv4/ip_forward
1
[root@camus]#

表 1 给出了几个可调节的参数,它们可以帮助您提高 Linux TCP/IP 栈的性能。

表 1. TCP/IP 栈性能使用的可调节内核参数
可调节的参数 默认值 选项说明
/proc/sys/net/core/rmem_default "110592" 定义默认的接收窗口大小;对于更大的 BDP 来说,这个大小也应该更大。
/proc/sys/net/core/rmem_max "110592" 定义接收窗口的最大大小;对于更大的 BDP 来说,这个大小也应该更大。
/proc/sys/net/core/wmem_default "110592" 定义默认的发送窗口大小;对于更大的 BDP 来说,这个大小也应该更大。
/proc/sys/net/core/wmem_max "110592" 定义发送窗口的最大大小;对于更大的 BDP 来说,这个大小也应该更大。
/proc/sys/net/ipv4/tcp_window_scaling "1" 启用 RFC 1323 定义的 window scaling;要支持超过 64KB 的窗口,必须启用该值。
/proc/sys/net/ipv4/tcp_sack "1" 启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。
/proc/sys/net/ipv4/tcp_fack "1" 启用转发应答(Forward Acknowledgment),这可以进行有选择应答(SACK)从而减少拥塞情况的发生;这个选项也应该启用。
/proc/sys/net/ipv4/tcp_timestamps "1" 以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。
/proc/sys/net/ipv4/tcp_mem "24576 32768 49152" 确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值(但是要记住,其单位是内存页,而不是字节)。
/proc/sys/net/ipv4/tcp_wmem "4096 16384 131072" 为自动调优定义每个 socket 使用的内存。第一个值是为 socket 的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。
/proc/sys/net/ipv4/tcp_rmem "4096 87380 174760" tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值。
/proc/sys/net/ipv4/tcp_low_latency "0" 允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项应该禁用。
/proc/sys/net/ipv4/tcp_westwood "0" 启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项。
/proc/sys/net/ipv4/tcp_bic "1" 为快速长距离网络启用 Binary Increase Congestion;这样可以更好地利用以 GB 速度进行操作的链接;对于 WAN 通信应该启用这个选项。

与任何调优努力一样,最好的方法实际上就是不断进行实验。您的应用程序的行为、处理器的速度以及可用内存的多少都会影响到这些参数影响性能的方式。在某些情况中,您认为有益的操作可能恰恰是有害的(反之亦然)。因此,我们需要逐一试验各个选项,然后检查每个选项的结果。换而言之,我们需要相信自己的经验,但是对每次修改都要进行验证。

提示:下面介绍一个有关永久性配置的问题。注意,如果您重新启动了 GNU/Linux 系统,那么您所需要的任何可调节的内核参数都会恢复成默认值。为了将您所设置的值作为这些参数的默认值,可以使用 /etc/sysctl.conf 在系统启动时将这些参数配置成您所设置的值。



回页首


GNU/Linux 工具

GNU/Linux 对我非常有吸引力,这是因为其中有很多工具可以使用。尽管其中大部分都是命令行工具,但是它们都非常有用,而且非常直观。GNU/Linux 提供了几个工具 —— 有些是 GNU/Linux 自己提供的,有些是开放源码软件 —— 用于调试网络应用程序,测量带宽/吞吐量,以及检查链接的使用情况。

表 2 列出最有用的几个 GNU/Linux 工具,以及它们的用途。表 3 列出了 GNU/Linux 发行版没有提供的几个有用工具。有关表 3 中工具的更多信息请参阅 参考资料

表 2. 任何 GNU/Linux 发行版中都可以找到的工具
GNU/Linux 工具 用途
ping 这是用于检查主机的可用性的最常用的工具,但是也可以用于识别带宽延时产品计算的 RTT。
traceroute 打印某个连接到网络主机所经过的包括一系列路由器和网关的路径(路由),从而确定每个 hop 之间的延时。
netstat 确定有关网络子系统、协议和连接的各种统计信息。
tcpdump 显示一个或多个连接的协议级的报文跟踪信息;其中还包括时间信息,您可以使用这些信息来研究不同协议服务的报文时间。

表 3. GNU/Linux 发行版中没有提供的有用性能工具
GNU/Linux 工具 用途
netlog 为应用程序提供一些有关网络性能方面的信息。
nettimer 为瓶颈链接带宽生成一个度量标准;可以用于协议的自动优化。
Ethereal 以一个易于使用的图形化界面提供了 tcpump(报文跟踪)的特性。
iperf 测量 TCP 和 UDP 的网络性能;测量最大带宽,并汇报延时和数据报的丢失情况。



回页首


结束语

尝试使用本文中介绍的技巧和技术来提高 socket 应用程序的性能,包括通过禁用 Nagle 算法来减少传输延时,通过设置缓冲区的大小来提高 socket 带宽的利用,通过最小化系统调用的个数来降低系统调用的负载,以及使用可调节的内核参数来优化 Linux 的 TCP/IP 栈。

在进行优化时还需要考虑应用程序的特性。例如,您的应用程序是基于 LAN 的还是会通过 Internet 进行通信?如果您的应用程序仅仅会在 LAN 内部进行操作,那么增大 socket 缓冲区的大小可能不会带来太大的改进,不过启用巨帧却一定会极大地改进性能!

最后,还要使用 tcpdumpEthereal 来检查优化之后的结果。在报文级看到的变化可以帮助展示使用这些技术进行优化之后所取得的成功效果。



回页首


参考资料

学习

获得产品和技术

讨论
posted @ 2006-02-15 09:34 深蓝色心情 阅读(467) | 评论 (0)编辑 收藏

Oracle Database 10g (10.1.0.2) Installation On RedHat Advanced Server 4.0

In this article I'll describe the installation of Oracle Database 10g (10.1.0.2) on RedHat Advanced Server 4.0. The article is based on a server installation with a minimum of 2G swap, secure Linux disabled and the following package groups installed:
  • X Window System
  • GNOME Desktop Environment
  • Editors
  • Graphical Internet
  • Text-based Internet
  • Server Configuration Tools
  • Development Tools
  • Administration Tools
  • System Tools
Alternative installations may require additional packages to be loaded in addition to the ones listed below.

Download Software

Download the following software:

Unpack Files

First unzip the files:
gunzip ship.db.cpio.gz
Next unpack the contents of the files:
cpio -idmv < ship.db.cpio
You should now have a single directory (Disk1) containing installation files.

Hosts File

The /etc/hosts file must contain a fully qualified name for the server:
<IP-address>  <fully-qualified-machine-name>  <machine-name>

Set Kernel Parameters

Add the following lines to the /etc/sysctl.conf file:
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
Run the following command to change the current kernel parameters:
/sbin/sysctl -p
Add the following lines to the /etc/security/limits.conf file:
*               soft    nproc   2047
*               hard    nproc   16384
*               soft    nofile  1024
*               hard    nofile  65536
Add the following line to the /etc/pam.d/login file, if it does not already exist:
session    required     /lib/security/pam_limits.so
Note by Kent Anderson: In the event that pam_limits.so cannot set privilidged limit settings see Bug 115442.

Disable secure linux by editing the /etc/selinux/config file, making sure the SELINUX flag is set as follows:
SELINUX=disabled
Alternatively, this alteration can be done using the GUI tool (Applications > System Settings > Security Level). Click on the SELinux tab and disable the feature.

Setup

Install the following packages:
# From RedHat AS4 Disk 2
cd /media/cdrom/RedHat/RPMS
rpm -Uvh setarch-1.6-1.i386.rpm
rpm -Uvh compat-libstdc++-33-3.2.3-47.3.i386.rpm

# From RedHat AS4 Disk 3
cd /media/cdrom/RedHat/RPMS
rpm -Uvh openmotif-2.2.3-6.RHEL4.2.i386.rpm
rpm -Uvh compat-db-4.1.25-9.i386.rpm

# From RedHat AS4 Disk 4
cd /media/cdrom/RedHat/RPMS
rpm -Uvh compat-gcc-32-3.2.3-47.3.i386.rpm
rpm -Uvh compat-gcc-32-c++-3.2.3-47.3.i386.rpm
Create the new groups and users:
groupadd oinstall
groupadd dba
groupadd oper

useradd -g oinstall -G dba oracle
passwd oracle
Create the directories in which the Oracle software will be installed:
mkdir -p /u01/app/oracle/product/10.1.0/db_1
chown -R oracle.oinstall /u01
Login as root and issue the following command:
xhost +<machine-name>
Edit the /etc/redhat-release file replacing the current release information (Red Hat Enterprise Linux AS release 4 (Nahant)) with the following:
redhat-3
Login as the oracle user and add the following lines at the end of the .bash_profile file:
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1; export ORACLE_HOME
ORACLE_SID=TSH1; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
#LD_ASSUME_KERNEL=2.4.1; export LD_ASSUME_KERNEL

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi

Installation

Log into the oracle user. If you are using X emulation then set the DISPLAY environmental variable:
DISPLAY=<machine-name>:0.0; export DISPLAY
Start the Oracle Universal Installer (OUI) by issuing the following command in the Disk1 directory:
./runInstaller
During the installation enter the appropriate ORACLE_HOME and name then continue with a "software only" installation.

Post Installation

Create a new instance using the DBCA. If you get the "ORA-27125: unable to create shared memory segment" error when using the DBCA issue the following commands as the oracle user then try again:
cd $ORACLE_HOME/bin

mv oracle oracle.bin

cat >oracle <<"EOF"
#!/bin/bash
 
export DISABLE_HUGETLBFS=1
exec $ORACLE_HOME/bin/oracle.bin $@
EOF
 
chmod +x oracle
I didn't encounter the previous issue myself, so hopefully you won't either.

Edit the /etc/redhat-release file restoring the original release information:
Red Hat Enterprise Linux AS release 4 (Nahant)
Finally edit the /etc/oratab file setting the restart flag for each instance to 'Y':
TSH1:/u01/app/oracle/product/10.1.0/db_1:Y
Create a file called /etc/init.d/dbora containing the following:
#!/bin/sh
# description: Oracle auto start-stop script.
# chkconfig: - 20 80
#
# Set ORA_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the 
# Oracle database in ORA_HOME.
ORA_HOME=/u01/app/oracle/product/10.1.0/db_1
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]
then
    echo "Oracle startup: cannot start"
    exit
fi
case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
        su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
        ;;
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
        ;;
esac
Use chmod to set the privileges to 750:
chmod 750 /etc/init.d/dbora
Link the file into the appropriate run-level script directories:
ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora
Associate the dbora service with the appropriate run levels:
chkconfig --level 345 dbora on
The relevant instances should now startup/shutdown automatically at system startup/shutdown.

For more information see:
Hope this helps. Regards Tim...

Back to the Top.
posted @ 2006-01-19 14:08 深蓝色心情 阅读(908) | 评论 (0)编辑 收藏

     摘要: Here is a summary (HOWTO) how I installed: Oracle 9iR2 (9.2.0.6.0) Database on Red Hat Advanced Server 4 (x86, kernel 2.6.9-5.EL, glibc-2.3.4-2) Oracle 9iR2 (9.2.0) Database on Red Hat Advanced Server...  阅读全文
posted @ 2006-01-19 13:51 深蓝色心情 阅读(2387) | 评论 (0)编辑 收藏