分类目录归档:编程语言

学习数据访问层中间件前言

最近打算找个开源的数据访问层中间件学习下,网上搜了一下,有Tddl,Cobar,Mycat等,有点乱花渐欲迷人眼的赶脚,Tddl是淘宝出的,据说只开源了部分功能,而且对内部系统比较依赖。Cobar看官网介绍,在阿里巴巴也经历过了一段时间的考验,代码和文档还算完整,最近没有什么更新。Mycat,基于Cobar开发,目前文档较多,更新较活跃。 3个项目地址如下: tddl:https://github.com/alibaba/tb_tddl cobar:https://github.com/alibaba/cobar mycat:https://github.com/MyCATApache 其他还有收费的,例如平民软件OneProxy。 记得在曾宪杰写的《大型网站系统与Java中间件实践》一书背后封面的名家力荐里,林昊指出了构建大型Java网站必备的三大利器—服务框架、消息中间件和数据访问层。服务框架Dubbo以前搞过,消息中间件Rocketmq去年断断续续写过一些文章,数据访问层还没有学习过,今年打算学习下。 打算先学习下Cobar。原因是项目拉下来瞅了几眼,分包模块清晰,代码工整。再有就是,在cobar-server的pom依赖只配置了log4j和junit,也就是说,Cobar的server端代码全部都是使用原生jdk编写的,可见原作者内功还是很深厚的,钦佩。最后,Cobar和Dubbo都是一个时期(2011-2013)的经典框架,大约出来时间都是2011年,都是在阿里巴巴运行2,3年,记得当时官网还是http://code.alibabatech.com/,Dubbo写的是日处理2亿次rpc请求,而这里Cobar写的是集群日处理在线SQL请求50亿次以上,说明他们都还比较成熟。 当然,其他2个项目也都是值得学习的。

发表在 编程语言 | 标签为 , | Comments Off on 学习数据访问层中间件前言

扩展webx资源装载器之HttpResourceLoader(一):简单实现

webx是一个开源的web框架,主页地址:http://www.openwebx.org/。这里我们主要说下使用http协议对网络中任意资源进行装载,来增强webx资源装载的功能。 用webx官网的mvn命令,生成tutorial1项目,里面webx的pom如下: 这个版本里,webx的resourceLoader有2种扩展: [res-loaders:webapp-loader /]:通过servletContext.getResource(resourceName)来获取资源。 [res-loaders:classpath-loader /]:通过classLoader.getResource(resourceName)来获取资源。 [res-loaders:super-loader/]:通过resource.xml里配置的资源别名,结合配置的资源加载器,来进行资源加载。这种是在前面2种的基础之上。 基于springExt,这里扩展点是res-loaders,捐献是webapp-loader,classpath-loader和super-loader。 新增一个http-loader,即[res-loaders:http-loader/],具体的捐献实现和配置在后面会再进行介绍,。 HttpResourceLoader简单类实现:

发表在 编程语言 | 标签为 , | Comments Off on 扩展webx资源装载器之HttpResourceLoader(一):简单实现

RocketMQ学习(九):顺序消息

rocketmq的顺序消息需要满足2点: 1.Producer端保证发送消息有序,且发送到同一个队列。 2.consumer端保证消费同一个队列。 先看个例子,代码版本跟前面的一样。 Producer类:

发表在 编程语言 | 标签为 , | Comments Off on RocketMQ学习(九):顺序消息

cassandra入门(三):便捷的@Accessor注解

如果说,入门二的用法是hibernate,那么这篇入门三的用法就更像ibatis。 完整的代码请参考:https://github.com/yankai913/cassandra-java-userguide。 由于本文复用了入门二的部分代码,所以这里只贴新增的。 新增表:

发表在 数据库, 编程语言 | 标签为 , | Comments Off on cassandra入门(三):便捷的@Accessor注解

cassandra入门(二):自定义类型使用和ORM

直接贴代码,cql和代码有些地方与分享电子书里的javaDriver21.pdf有些出入,请以博文为准,cql和代码都是实测跑通的。 cql脚本(在cqlsh.bat窗口里跑): 自定义类型:phone和address。 表:accounts 。

发表在 数据库, 编程语言 | 标签为 , | Comments Off on cassandra入门(二):自定义类型使用和ORM

cassandra入门(一):jdbc连接cassandra作增删改查

先分享一个最新的cassandra-java-driver文档,点击电子书分享里的链接,找到javaDriver21.pdf。 该文档内容比较全,包含:jdbc连接cassandra集群,执行cql增删改查,批量查询,异步查询,cql的类型和java类型的映射关系及用户自定义类型使用,ORM等。 Cassandra是一个NoSql数据库,纯java编写,apache的顶级项目,主页:http://cassandra.apache.org/(简介不多说网上有)。 入门步骤:(我的jdk版本是1.7.0_71,win7系统) 1.去主页下载cassandra,我下载的是apache-cassandra-2.1.9,然后bin/cassandra.bat启动数据库,如果想使用bin/cqlsh.bat则需要安装python2.7。 2.贴代码

发表在 数据库, 编程语言 | 标签为 , | Comments Off on cassandra入门(一):jdbc连接cassandra作增删改查

RocketMQ学习(八):事务消息

源代码版本是3.2.6,还是直接跑源代码。rocketmq事务消息是发生在Producer和Broker之间,是二阶段提交。 二阶段提交过程看图: 第一阶段是:步骤1,2,3。 第二阶段是:步骤4,5。 具体说明: 只有在消息发送成功,并且本地操作执行成功时,才发送提交事务消息,做事务提交。 其他的情况,例如消息发送失败,直接发送回滚消息,进行回滚,或者发送消息成功,但是执行本地操作失败,也是发送回滚消息,进行回滚。

发表在 编程语言 | 标签为 , , | Comments Off on RocketMQ学习(八):事务消息

RocketMQ学习(七):消息的生命周期下之消息的消费

源代码版本是3.2.6。接着上一篇消息的产生,这篇是消息的消费。Consumer选择DefaultMQPushConsumer为例。 1.DefaultMQPushConsumer.start()开始。 2.RebalanceService.run()方法定时调用RebalanceImpl.doRebalance()方法,该方法内部是遍历订阅的topic,执行rebalanceByTopic(topic)。 3.调用RebalanceImpl.updateProcessQueueTableInRebalance(),构造PullRequest,从Broker获取nextOffset,pullRequest.setNextOffset(nextOffset),同时更新本地消费进度记录。 4.调用RebalancePushImpl.dispatchPullRequest(List)。 5.调用PullMessageService.executePullRequestImmediately(final PullRequest)放入pullRequestQueue队列中去。 6.PullMessageService.run()从pullRequestQueue队列中取出PullRequest,调用DefaultMQPushConsumerImpl.pullMessage(pullRequest)作拉取消息的动作。

发表在 编程语言 | 标签为 , | Comments Off on RocketMQ学习(七):消息的生命周期下之消息的消费

RocketMQ学习(六):消息的生命周期上之消息的产生

源代码版本是3.2.6。消息的生命周期包括2部分,消息的产生和消息的消费,这篇先说下前者。消息的产生详细一点可以分为: a.消息产生后由Producer发送至Broker。 b.Broker接收到消息做持久化。 调试代码得到这样的过程, 1.DefaultMQProducer.send()发出消息。 2.DefaultMQProducerImpl.sendDefaultImpl()发出消息。 3.DefaultMQProducerImpl.tryToFindTopicPublishInfo(),即向Namesrv发出GET_ROUTEINTO_BY_TOPIC的请求,来更新 MQProducerInner的topicPublishInfoTable和MQConsumerInner的topicSubscribeInfoTable。 4.调用topicPublishInfo.selectOneMessageQueue(),从发布的topic中轮询取出一个MessageQueue。默认一个topic对应4个MessageQueue。

发表在 编程语言 | 标签为 , | Comments Off on RocketMQ学习(六):消息的生命周期上之消息的产生

RocketMQ学习(五):Pull和Push

源代码版本是3.2.6。在rocketmq里,consumer被分为2类:MQPullConsumer和MQPushConsumer,其实本质都是拉模式(pull),即consumer轮询从broker拉取消息。 区别是: push方式里,consumer把轮询过程封装了,并注册MessageListener监听器,取到消息后,唤醒MessageListener的consumeMessage()来消费,对用户而言,感觉消息是被推送过来的。 pull方式里,取消息的过程需要用户自己写,首先通过打算消费的Topic拿到MessageQueue的集合,遍历MessageQueue集合,然后针对每个MessageQueue批量取消息,一次取完后,记录该队列下一次要取的开始offset,直到取完了,再换另一个MessageQueue。

发表在 编程语言 | 标签为 , | Comments Off on RocketMQ学习(五):Pull和Push