mongoDB数据库和Spring MVC的三结合

① 、集群配置

Couchbase 数据分布

在Couchbase数据分布是按总括分配到几个节点上,每一个节点都储存两片段数据有效数据和副本数据,客户端对数据的操作主借使依据节点中对应的灵光数据进行操作,执行压力会有的到不一样的节点,类似如下图所示:

图片 1

 

Couchbase的集群众管理理是由erlang/otp举行集群通讯管理,集群之间利用心跳机制举行监测服务器节点健康监测,配置参数信息是同步到每2个节点上进展仓库储存。整个集群以vbucket为单位划分映射到不一样服务器节点中展打开仓库储,划分规则如下:

  1. 均匀的分红有效vbucket和副本vbucket到分裂服务器节点中;
  2. 把有效数据与副本数据划分到不一样物理节点中;
  3. 在复制多份数据时,尽量有别的节点实行数据传播;
  4. 增添时,以最小化数据迁移量举行复制。

 

总结

以上海大学致介绍 Couchbase
服务器的数目标分布式储存架构及一些分布式理论的文化。

Couchbase在系统一分配布式方面提供了根基的支撑,然则在遍布
式储存的一致性、可用性和分区性是必要全部权衡,Couchbase
服务器提供了二种抉择的措施让用户依照自身的事体场景选用不一样的非功效性的须要点,来
达成对数码的蕴藏。欢迎大家访问一下极光推送

其三步、MongoDB的增加和删除改查

复制

为了保证分布式存款和储蓄系统的高可信和高可用,数据在系统中貌似存款和储蓄三个副本。当有些副本所在的囤积节点出现故障时,分布式存款和储蓄系统能够活动将劳动切换来任何的副本,从而完毕自动容错。

贰 、查询示例代码

容错

单台服务器故障的可能率是不高的,不过,只要集群的层面充足大,天天都只怕有机械故障产生,系统需求可以自动处理。首先,分布式存款和储蓄系统需求能够检测到机械故障,在分布式系统中,故障检测往往通过租约协议落实。接着,需求能够将劳动复制或然迁移到集群中的其它正规服务的积存节点。

在Couchbase中可分单集群中和多集群容错:

  1. 单集群中得以设置auto-failover的法门来促成活动容错。管理员可在后台设置auto-failover的年华,当集群检测到单点机器超越设置的命宫后,则采取uuid/seqno为新型的机械的副本数据激活,更新vbucket所映射的服务器来平复工作。
  2. Couchbase现阶段没有兑现多集群容错的点子,在统一筹划使用的时候,须要检测单机群难题,实行集群的切换到过来工作。

前边平素用到的门类是Spring
MVC+maven+mysql的,近期不怎么数据须求选拔mongoDB数据库,以往做一些总括。

负载均衡

在 Couchbase
中,我们所操作的每1个bucket会逻辑划分为102两个vbucket,其数量的储存基于各样vbucket储存并且每一种vbucket都会炫耀到相呼应的服务器节点,那种储存结构的点子叫做集群映射。如下图所示,当使用与Couchbase服务器交互时,会因此SDK的与
服务器数据开始展览互动,当使用操作某3个的bucket的key值时,在SDK中会通过哈希的措施测算,使用公式crc32(key)%1024规定key
值是属于102陆个vbucket中的某些,然后依照vbucket所映射的节点服务器对数码举办操作。

图片 2

 

接口:

正文首要运用分布式储存的有的辩驳来分析 Couchbase
的数据服务的分布式数据存款和储蓄模型。

第一步:加载jar、maven配置

Couchbase 的数据服务在单机、
集群安装,集群、多集群通讯皆以万分简单去做的。在早晚的情景下,使用Couchbase是充足好的取舍。

<mongo:mongo id="mongo" host="${mongo.host}" port="${mongo.port}" >
        <mongo:options connections-per-host="${mongo.connectionsPerHost}" 
            threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" 
            connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" 
            auto-connect-retry="${mongo.autoConnectRetry}" socket-keep-alive="${mongo.socketKeepAlive}" 
            socket-timeout="${mongo.socketTimeout}" slave-ok="${mongo.slaveOk}" write-number="1" 
            write-timeout="0" write-fsync="true"/> 
    </mongo:mongo>

DCP (Database Change Protocol)

DCP
协和式飞机是三个便捷的二进制协议,它最首要用来集群内的多少复制、索引复制、备份数据等等。主要概念有以下几点:

  1. 不变复制,基于每一个vbucket存在二个逐项种类号,同步时依据连串号实行立异;
  2. 重启苏醒,当四头再而三中断后,重新连接后,会对争持数据举行理并答复原;
  3. 一致性,使用快速照相数据同步数据统一性;
  4. 内部存款和储蓄器间复制。
<!-- mongodb开始 -->
         <dependency>  
            <groupId>org.mongodb</groupId>  
            <artifactId>mongo-java-driver</artifactId>  
            <version>3.3.0</version>  
        </dependency> 
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>1.7.1.RELEASE</version>
        </dependency>
        <!-- mongodb结束 -->

B+树结构

 如下图所示:主节点指向中间节点.
这个中级节点指向叶节点。主节点和中级节点针对它们的子树能够分开指向文档范围的高低。叶节点储存了文档ID和元数据指向值所蕴藏的文书地点。

图片 3

 

接口达成:

分布式协议

@Override
    @Path("getInterviewNum")
    @GET
    @Produces({"application/json; charset=UTF-8"})
    public long getInterviewNum(@QueryParam("beginDate")String beginDate, @QueryParam("endDate")String endDate) {
        long Num=mongo.count(new Query(Criteria.where("time").gt(beginDate).lte(endDate)), Interview.class);
        return Num;
    }

@Override
    @Path("getPageGroup")
    @GET
    @Produces({"application/json; charset=UTF-8"})
    public List<Pagecount> getPageGroup(@QueryParam("beginDate")String beginDate) {
        Criteria criatira= new Criteria();
        criatira.andOperator(Criteria.where("time").is(beginDate));
        List<Pagecount> pagecount = new ArrayList<Pagecount>();
        String year= beginDate.substring(0,4);
        String month=beginDate.substring(5);
        mongo.getDb().eval("pagelog("+year+","+month+")");
        //mongo.getDb().eval("pagelog("+beginDate+")", pagecount);
        pagecount= mongo.find(new Query(criatira).with(new Sort(new Order(Direction.DESC, "pagenum"))), Pagecount.class); 
        return pagecount;
    }  

数据分布

分布式系统分裂于古板单机系统在于能够将数据分布到多少个节点,并在多少个节点之间实现负载均衡。

 

复制的概述

分布式存款和储蓄系统中多郎中存多个副本,一般的话,当中1个副本为主副本,此外副本为备副本,常见的做法是数额写入到主副本,由主副本明确操作的次第并复制到此外副本。以下是二种复制类型:

  • 强联手复制:复制协议供给主备同步成功才可以再次来到客户端写成功,那种协议称为强同步协议。强联手球组织议提供了强一致性,然则,倘诺备副本出现难点将阻塞写操作,系统可用性较差。
  • 异步复制:在异步复制下,主副本不供给等待备副本的回答,只须求地面修改成功就足以告诉客户端写操作成功。异步复制的补益在于系统可用性较好,不过一致性较差,假若主副本产生不可苏醒故障,只怕有失最终一部分更新操作。
mongo.dbname = test_db #数据库名称
mongo.password = test_pwd #密码
mongo.username = test_user #用户名
mongo.host = 127.0.0.1 #主机
mongo.port= 27017 #端口号
mongo.connectionsPerHost= 8 #一个线程变为可用的最大阻塞数
mongo.threadsAllowedToBlockForConnectionMultiplier= 4 #线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值
mongo.connectTimeout= 1500 #连接超时时间(毫秒)
mongo.maxWaitTime= 1500 #最大等待时间
mongo.autoConnectRetry= true #自动重连
mongo.socketKeepAlive= true #scoket保持活动
mongo.socketTimeout=1500 #scoket超时时间
mongo.slaveOk=true #读写分离

多少存款和储蓄引擎

Couchstore(Couchbase的数量存储引擎)是按vbucket为单位的公文储存在文件系统中。Couchstore应用B+树算法
通过key值去急忙指向它的情节。 为了火速的写,
Couchstore应用了扩展写的模型(见下文介绍)对每3个文件举行神速和平安的写操作。

注:在Couchbase中,bucket是用户所操作文书档案数据的聚合,vbucket是系统平均划分bucket的多少举行分片数据的集聚。

控制层:

数码存款和储蓄

存款和储蓄引擎直接控制了仓库储存系统可以提供的品质和机能。在 Couchbase
的数目储存分对象缓存和数量存款和储蓄引擎。如下图所示应用对数码的操作首先是对内部存储器操作,然后才会异步更新至数据存款和储蓄引擎中。对于
Couchbase,数据层 以 memcached API 对数码开始展览交互,系统在 memcached
程序中放到持久化引擎代码对数码进行缓存、复制、持久化等操作,持久化操作正是一起数据至
CouchDB 中(新版代码中追加了forestDB引擎)。对于图中的复制是在第一节中详尽介绍。

图片 4

 

叁 、mongoDB存款和储蓄进程:

跨机房安插

在分布式系统中,跨机房难点一贯都以相比较复杂难点。机房之间的网络延时较大,且不安宁。跨机房难点首要涵盖七个地点:数据同步以及劳动切换。

在Couchbase中能够以一下三种艺术跨机房:

  • 集群全部切换,那种办法是八个机房铺排了一如既往的Couchbase集群,由XDCP以异步情势共同集群副本,当出现难题时,可切换集群。那种格局的标题是
    当主机房全体出现故障时,有三种选取:要么将服务切换来备机房,忍受多少丢失的风险;要么停止服务,直到主机房恢复生机截至。因此,主备机房切换往往是手工的,允许用户依据作业的性状接纳“丢失数据”可能“结束服务”。
  • 单个集群跨机房,这种艺术是将单个集群布置到几个机房,允许不一致数量分片的主副本位于差异的机房。那种方法根本是考虑到写多少的时候,一致性相比强的多少是一同到每一种节点中才算写成功的案例,当机房出现难点时,超越百分之二十五数额是足以持续可用。

二 、单机配置

分布式数据库一般是从单机关周全据库增加而来,用于存款和储蓄结构化数据。分布式数据库选用二维表格组织数量,提供SQL关系查询语言,支持多表关联,嵌套子查询等繁杂操作,并提供数据库事务以及并发控制。

@Document(collection="countlog")
public class Pagecount implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    private String id;

    private String time;
    //private long  fid;
    List<Integer> fid = new ArrayList<Integer>();
    //private Integer pagenum;
    List<Integer> pagenum = new ArrayList<Integer>();

    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public List<Integer> getFid() {
        return fid;
    }
    public void setFid(List<Integer> fid) {
        this.fid = fid;
    }
    public List<Integer> getPagenum() {
        return pagenum;
    }
    public void setPagenum(List<Integer> pagenum) {
        this.pagenum = pagenum;
    }


}

XDCR (Cross Data Center Replication)

XDC奥迪Q7提供了两个有效vbucket的数指标复制,主要用来跨数据基本的多集群间的复制。首要概念有弹指间几点:

  1. 基于bucket复制,八个集群的同多少个bucket能够完毕单向恐怕双向复制;
  2. 通过DCP协议保持持续性复制,2个XDC本田UR-V连接中总结八个DCP数据流。那个流能够根据差其他分区对目标集群开始展览同步复制;
  3. 支撑各个集群拓扑复制。集群间可以由此单方面,双向复制。八个集群能够完成1对1,1对多,多对1等的集群复制拓扑图;
  4. 康宁复制。数据大旨见传输数据可以应用SSL进行加密;
  5. 说到底一致性和平消除决数量冲突的力量。当出现冲突数据,会接纳元数据的类别值,CAS值,文书档案标签和过期时限对数码举行顶牛消除。

applicationContext.xml

Couchbase 是二个存有高质量、可扩展性和可
用性强的数据库引擎。它能够让开发职员通过 NoSQL 的键值存款和储蓄(二进制恐怕JSON)恐怕选拔N1QL 的款式对数码进行操作(N1QL 是十一分接近于 SQL 的一种语法操作 JSON
数据的点子)。从前天完全架构来看,Couchbase
是往分布式数据库的来头发展下去。

mongodb.database=cxstatistics
mongodb.replicaSet = 10.0.11.28:27017,10.0.11.29:27017,10.0.11.30:27017

集群内复制(单集群内复制)

集群内复制主要针对同3个集群中多个节点的数据开始展览多份复制备份,并且复制的份数会遍布到不一样的节点中。在数据分布中大家清楚各类节点都会储存有效

vbucket和复制的vbucket。如下图显示,当使用对对数据进行写操作,此操作会先到集群节点中所对应有效的vbucket的多寡开始展览写操作,并
且有效的vbucket节点会基于DCP协议传输写操作的变更传输到复制的vbucket所对应的节点,对复制的vbucket实行更改。可复制的
vbucket的份数,能够在操作bucket的时候实行铺排,备份数据为1-3份。

图片 5

 

集群内复制在Couchbase中能够由使用在写多少的时候选拔一致性与可用性之间的权衡,Couchbase提供了以下二种方式的复制:

  1. 内存级的积存。此种方式是当使用写多少时,当数码已经储存到内部存款和储蓄器中后,就会回到正确回复给采纳,同步其他节点和持久化储存都以由异步处理。此种格局速度最快,绝对的容错性也是最差。
  2. 内存+持久化级的仓储。此种方式是当使用写多少时,唯有数量储存在内部存款和储蓄器和硬盘中后,才会回来正确回复给接纳,同步其余节点是异步处理格局。此种格局,假使单节点出现难点,数据恐怕出现不一样性。
  3. 内部存款和储蓄器+备份节点级的积存。此种形式是当使用写多少时,唯有数据存款和储蓄同步到任何节点的内部存款和储蓄器中时,才会重临正确回复给选取,持久话处理都以异步处理,应用是能够接纳出一块数据的节点数量。此种格局保障了数量肯定备份和容灾,可是也有自然或者数量尚未持久话会丢失。
  4. 内部存款和储蓄器+持久化+备份节点的贮存。此种形式是当使用写多少时,数据存储必须满足所急需的节点中内部存款和储蓄器复制和持久化都形成后,才足以回到正确给选用。那种情势有限援助即便有效vbucket节点机器出现不能够恢复生机的故障。

注:在程序流程中,第1,3,4种储存方法持久化数量节点和备份节点的数据是由客户端进行安装和进行检查和测试的。第②种储存方法客户端是平素开始展览操作并且没有检查和测试进程的。

在对于读的一致性的权衡,Couchbase 也提供了以下三种样式:

  1.  读取时,获取一致性的的多寡。此种格局是当数码更新后全体的运用读到数据都以同一的。重要原理是读和写都以操作可行vbucket。
  2. 读取时,能够博得分裂性的数据。此种格局符合对于对数码一致性不是很要紧,对可用性相比较讲究的地方。首要原理是读的时候,有效vbucket不可用时,数据会从备份vbucket中获取数据。

 

Couchbase 中的复制

配备文件common-config.properties

目的缓存

指标缓存提供先内部存款和储蓄器储存的架构,使得的读与写的操作下落了延期。对象储存是属于在内部存款和储蓄器中以hash储存方法储存,帮忙增、删、改,以及自由读取操
作,其哈希分片大小,依照所蕴藏的多寡项的量会动态变动。如下图,对象缓存依据key值得有关运算总结出分片的哈希值,然后会依据依照所储存项的多少,在
3个哈希分片以链表串连数据,各个内部存款和储蓄器中储存的数据结构见图所示。

图片 6

 

Couchbase
中读数据是先从内部存款和储蓄器中找寻key值是或不是留存,假诺存在则重回值,假使不存在缓存中,则会从磁盘中获取数据,要是数据存在,放入缓存,最终在回去数据值。

注:对于目的缓存大小的设置,在组织者操作平斯特拉斯堡,能够为种种bucket设置相应的RAM内部存储器的高低。

 

日增写模型

充实写格局即具备的写操作只扩张数据到文件底部,而不改动老的多少,在极光消息推送系统中的数据删除或许更新后,原来的数据变成废物数据,那足以加快磁盘的写速
度。假使那一个数量直接保存下去,文件会无限膨胀下去,为了缓解这些题材,要求定期执行统一操作以落到实处污源回收。所谓统一操作,即将有所老数据文件中的数据扫描三遍并生成新的数据文件,那里的集合其实正是对同三个key的八个操作以只保留最新3个的原则开始展览删减,每一遍合并后,新生成的数据文件就不再有冗余数据了。

Interview.java

跨数据主导复制(多集群间复制)

跨数据基本复制首尽管针对性多个集群间的数目复制,此种复制首要以异步的方法通过XDCMurano协议员联盟手数据到其余集群中备份,从而实现单集群或机房出现问题级的容灾。跨数据主导复制是以bucket为单位开始展览复制的,在组织者操作界面能够通过安顿XDCLX570来拓展此种复制方式,下图为跨数据主导复制示例图:

图片 7

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        http://www.springframework.org/schema/jee
        http://www.springframework.org/schema/jee/spring-jee-4.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/schema/util
        http://www.springframework.org/schema/schema/util/spring-util-4.1.xsd
        http://www.springframework.org/schema/data/mongo
        http://www.springframework.org/schema/data/mongo/spring-mongo-1.5.xsd
        http://www.springframework.org/schema/data/repository
        http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd
        ">

   <mongo:mongo  id="mongo"  replica-set="${mongodb.replicaSet}" />
   <mongo:db-factory dbname="${mongodb.database}" mongo-ref="mongo"/> 

    <!-- mongo模板操作对象 -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    </bean>

</beans>

Couchbase的分布式及理论

CAP理论:一致性(Consistency),可用性(Availability)以及分区可容忍性(Tolerance
of network Partition)三者不可能而且满意。

  • 一致性:读操作总是能读取到以前达成的写操作结果,满足那一个原则的系统称为强一致系统,那里的“此前”一般对同一个客户端而言;
  • 可用性:读写操作在单台机器发出故障的景色下依旧能够寻常实施,而不须求等待产生故障的机珍视启恐怕其上的劳动员搬迁移到任何机器;
  • 分区可容忍性:机器故障、互连网故障、机房停电等至极意况下仍是可以够满足一致性和可用性。

分布式存款和储蓄系统需要能够活动容错,也便是说,分区可容忍性总是要求满足的,因而,一致性和写操作的可用性不可能而且满意。

以下表格描述了Couchbase 所对应的 CAP 理论的配置格局:

陈设拓扑结构

故障范围爱戴

CAP 平衡

评论

单Couchbase服务器机群

节点故障(例如, 节点此前硬件故障,通讯战败)

能够配备成CP,并且能够经过配置auto failover操作获得实惠

当故障时,Couchbase服务器允许有效的读和布局
auto-failover2个很少的日子超时来平复写的可用性。

多Couchbase服务器机群单向XDC卡宴复制

节点或机群故障 (例如: 数据主旨自然灾难)

AP是透过XDC奇骏机群间单向复制来防备节点故障恐怕

单向复制能够用来共同数据在秒级总括能力数据基本中,

目标集群数据就能够透过最终一致性的数量用来读取和当原集群故障时,升级为读写集群(主从方式业务,读写分离)

多Couchbase服务器机群双向XDC宝马7系复制

节点或机群故障(例如: 数据基本自然患难)

AP是通过XDC普拉多机群间双向向复制来幸免节点故障恐怕

双向服务能够用于有效/划分总结能力的跨数据基本,指标集群数据就可以读取和写最后一致性的多少在安静情形,你会意识四个集群在操作同贰个数额时产生了争论,许多用户使用写在差其余撤销合并段来让个别集群来处理幸免冲突。(多主形式)

 最后一致性主若是根源 BASE 理论。BASE 理论是对 CAP
理论的延伸,核心理想是不怕不能完结强一致性(StrongConsistency,CAP的一致性正是强一致性),但运用能够采纳适合的不二法门完毕最终一致性(伊夫ntual
Consitency)。

主干可用(Basically Available)
基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即确定保障焦点可用。
电商大促时,为了回应访问量剧增,部分用户或许会被辅导到降级页面,服务层也说不定只提供降级服务。那正是损失部分可用性的反映。
软状态( Soft State)
软状态是指允许系统存在中间状态,而该中间状态不会影响系统完全可用性。分布式存款和储蓄中一般一份数据至少会有七个副本,允许分歧节点间副本同步的延时便是软状态的反映。
说到底一致性( 伊芙ntual Consistency)
最终一致性是指系统中的全数数据副本草纲目过一定时间后,最后能够完毕同等的事态。弱一致性和强一致性相反,最终一致性是弱一致性的一种独特别情报况。

第二步:配置

@Document(collection="pagelog")
public class Interview implements Serializable {



    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    private String id;

    private String time;
    private String desc;
    private long _createtime;
    private Integer _processed;
    private long fid;
    private String templateType;
    private long puid;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public long get_createtime() {
        return _createtime;
    }
    public void set_createtime(long _createtime) {
        this._createtime = _createtime;
    }
    public Integer get_processed() {
        return _processed;
    }
    public void set_processed(Integer _processed) {
        this._processed = _processed;
    }
    public long getFid() {
        return fid;
    }
    public void setFid(long fid) {
        this.fid = fid;
    }
    public String getTemplateType() {
        return templateType;
    }
    public void setTemplateType(String templateType) {
        this.templateType = templateType;
    }
    public long getPuid() {
        return puid;
    }
    public void setPuid(long puid) {
        this.puid = puid;
    }




}

applicationContext.xml

Pagecount.java

壹 、Mongodb对象模型

function(year,month){
var time=year+'-'+month;
if(month<10){
   time=year+'-0'+month;
 }
var num=[];
var fid=[];
db.getCollection('pagelog').aggregate([ { $match : {'time':{$regex: "^" + time + ".*$"}} },{$group : { _id : "$fid", num : {$sum : 1}}}]).forEach(function(obj){
            num.push(obj.num);
            fid.push(obj._id);
 })
document1=num;
document2=fid;
 db.countlog.update({'time':time},{$set:{'fid':document2,'pagenum':document1,'time':time}},true,true);
return time;
}
@Path("")
public class InterviewController {

    @Autowired
    StatisticsService statisticsService;


    @Post("/interview")
    @Get("/interview")
    @AdminLoginRequired
    public String index(Invocation inv) {
        Calendar c = Calendar.getInstance();   
        c.add(Calendar.MONTH, -1);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");  
        String mDateTime=formatter.format(c.getTime());  
        inv.addModel("dateTime", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        inv.addModel("mDateTime", mDateTime);
        return "/views/statistics/interview.vm";
    }

    @Post("/getInterview")
    @Get("/getInterview")
    public String getInterview(Invocation inv,@Param("beginDate")String beginDate,@Param("endDate")String endDate){
        long Num = statisticsService.getInterviewNum(beginDate, endDate);
        inv.addModel("Num", Num);
        JSONObject json = new JSONObject();
        json.put("Num", Num);
        return "@"+json;
    }

    @Post("/interviewGroup")
    @Get("/interviewGroup")
    @AdminLoginRequired
    public String indexGroup(Invocation inv) {
        Calendar c = Calendar.getInstance();   
        c.add(Calendar.MONTH, -1);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");  
        String mDateTime=formatter.format(c.getTime()); 
        inv.addModel("mDateTime", mDateTime);
        return "/views/statistics/interviewGroup.vm";
    }

    @Post("/getPageGroup")
    @Get("/getPageGroup")
    public String getPageGroup(Invocation inv,@Param("beginDate")String beginDate){
         List<Pagecount> Pagecount = new ArrayList<Pagecount>();
         Pagecount = statisticsService.getPageGroup(beginDate);
         JSONObject json = new JSONObject();
         json.put("list", Pagecount);
         return "@"+json;
       }      
}

布署文件common-config.properties

/**
     * 得到时间区间内的统计数据
     * @param beginDate
     * @param endDate
     * @return
     */
    public long getInterviewNum(String beginDate, String endDate);



/**
     * 得到时间区间内根据fid排序的统计数据list
     * @param beginDate
     * @return
     */
    public List<Pagecount> getPageGroup(String beginDate);

发表评论

电子邮件地址不会被公开。 必填项已用*标注