资讯专栏INFORMATION COLUMN

分布式NoSQL数据库的Spring整合实践

awkj / 1432人阅读

摘要:数据库目前在技术界正在成为主流,因此巨杉数据库支持海量分布式数据存储,提供常见开发语言驱动程序便于开发人员直接操作数据库中的数据。支持标准,巨杉套件通过扩展功能可以使用标准语句访问数据库,完成对数据库的各种操作。

背景

Spring在J2EE应用程序开发框架中占据重要的作用,它实现了轻量级的IoC(控制反转)和AOP(面向切面)容器框架,能够对JavaBean的生命周期进行管理,可以多带带使用也可以和其他框架进行整合,如Struts、MyBatis、Hibernate等主流框架。

Spring的IoC技术促进了低耦合,能够将一个对象依赖的其它对象通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。面向切面的特性,允许通过分离应用的业务逻辑与系统级服务(例如审计和事务管理)进行开发,业务逻辑主要完成业务的各种功能,系统级服务负责其它的关注点,例如日志或事务支持。Spring包含并管理应用对象的配置和生命周期,做为一种容器可以根据业务特性创建一个多带带的实例或者每次需要时都生成一个新的实例。Spring可以将简单的组件配置组合成为复杂的应用,因此能很好的与其他J2EE应用开发框架进行集成。

NoSQL数据库目前在技术界正在成为主流,因此巨杉数据库SequoiaDB支持海量分布式数据存储,提供常见开发语言驱动程序便于开发人员直接操作数据库中的数据。在大部分企业级应用程序开发过程中,大部分开发人员或者客户倾向于使用标准的SQL语句做为数据操作的标准接口。巨杉数据库利用巨杉SequoiaDB SSQL套件支持标准的SQL语句对数据库中的数据进行各种操作,本文主要讲解巨杉SequoiaDB SSQL套件与常见的J2EE开发框架进行集成以及开发过程中遇到问题的解决思路。

产品介绍

巨杉数据库SequoiaDB是一款分布式非关系型文档数据库,可以被用来存取海量非关系型的数据,其底层主要基于分布式,高可用,高性能与动态数据类型设计,它兼顾了关系型数据库中众多的优秀设计:如索引、动态查询和更新等,同时以文档记录为基础更好地处理了动态灵活的数据类型。PostgreSQL支持标准SQL,巨杉SequoiaDB SSQL套件通过扩展 PostgreSQL功能可以使用标准SQL 语句访问 SequoiaDB 数据库,完成对SequoiaDB 数据库的各种操作。常见J2EE应用持久层开发框架,如Mybatis、Hibernate等支持PostgreSQL数据库,而这些框架能很好的与Spring进行集成。因此巨杉SequoiaDB SSQL套件与Spring集成和PostgreSQL与Spring集成流程相同。

环境搭建 3.1 软件配置

操作系统:windows 7
JDK:1.7.0_80 64位,下载地址为:

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u80-oth-JPR

Myeclipse:12.0.0
SequoiaDB:1.12.5或以上版本
SequoiaDB SSQL:9.3.4
依赖包:Spring 3.2.4、mybatis 3.3.0、mybatis-spring 1.1.1、mybatis-paginator 1.2.5、postgresql-9.3.jdbc4-20131010.203348-4

本项目主要实现从SequoiaDB中查询数据并分页来展示Spring整合SequoiaDB SSQL整合的整个过程。

创建项目工程如图:

说明:

Spring整合SequoiaDB的时候建议选择DBCP连接池管理数据库连接

SequoiaDB以及SequoiaDB SSQL安装可参考SequoiaDB官网上面的安装和连接器章节

3.2 集合空间和集合创建及数据准备 1. 以sdbadmin用户登录,进入到/opt/sequoiadb/bin目录中,进入到SDB Shell控制台创建集合空间和集合

创建集合空间脚本如下:

var db = new Sdb();
db.dropCS("CS");

创建集合脚本如下:

db.CS.createCL("account_tx");

执行结果如下图:

2. 退出SDB Shell脚本,在linux控制台执行下面命令导入数据:
./sdbimprt --hosts=node03:11810,node02:11810 --type=csv --file=cs.csv -c CS -l account_tx --fields="account_id long,tx_id long,customer_name string,tx_time string,tx_value int,account_overage long,tx_type int,other_side_account long,tx_site string,summary string" -j 3

执行结果如下图:

3. 利用PostgreSQL连接器创建数据库和外部表

创建数据库的脚本如下:

bin/createdb -p 5432 cs

创建外部表的脚本如下:

create foreign table account_tx(account_id bigint,tx_id bigint,customer_name text,tx_time text,tx_value integer,account_overage bigint,tx_type integer,other_side_account bigint,tx_site text,summary text
) server sdb_server options ( collectionspace "CS", collection "account_tx" ) ;

执行结果如下图:

4. 在PostgreSQL验证测试数据

验证测试数据脚本如下:

select * from account_tx limit 5;

执行结果如下图:

代码展示 4.1 框架搭建代码展示 1.在web.xml文件初始化配置信息,如Spring listener和Dispatcher以及加载Spring相关配置文件。

具体配置信息如下:

    
    
        csWeb
        
            index.jsp
        
        
            contextConfigLocation
            classpath:applicationContext-*.xml
        
        
            org.springframework.web.context.ContextLoaderListener
        
        
            springmvc
            org.springframework.web.servlet.DispatcherServlet
            
            contextConfigLocation
            classpath:springmvc.xml
            
        
        
            springmvc
            *.do
        
    
2. 数据库连接信息在jdbc.properties中配置,具体信息如下:
    jdbc.driver=org.postgresql.Driver
    jdbc.url=jdbc:postgresql://192.168.1.48:5432/cs
    jdbc.username=sdbadmin
    jdbc.password=
3. 数据操作以及事务控制配置信息在applicationContext-dao.xml和applicationContext-transaction.xml中。

applicationContext-dao.xml具体信息如下:

    
        
        
    
    
    
    
    
    
    
        
            
            
                
                    classpath:mapper/*.xml
                
            
            
        
        
            
            
        
    

applicationContext-transaction.xml具体信息如下:

    
        
        
        
        
        
            
            
        
        
            
                
                
                
                
            
        
        
            
        
    
4. spring MVC配置信息在springmvc.xml,具体信息如下:
    
    
        
        
        
        
            
            
        
        
            
                
                    
                
            
        
    
5. 数据操作采用的是MyBatis框架,MyBatis框架与Spring整合信息在mybatic-config.xml中,具体信息如下:
    
    
    
        
            
        
        
            
                
    
                
                
                
                
                
                
            
        
    
4.2 业务实现代码展示

Spring整合SequoiaDB SSQL采用MVC设计模式,在Model层将外部表account_tx信息封装到实体类,dao层采用MyBatis框架操作,Service层完成具体的业务逻辑,Controller层完成视图的响应以及各种用户动作业务的实现。

1. Model层account_tx对应实体类在AccountTx类中,具体信息如下:
    package com.sequoiadb.cs.entity;
    
    import java.io.Serializable;
    
    public class AccountTx implements Serializable {
    
        private String account_id;
        private String tx_id;
        private String customer_name;
        private String tx_time;
        private int tx_value;
        private long account_overage;
        private int tx_type;
        private String other_side_account;
        private String tx_site;
        private String summary;
    
        public String getAccount_id() {
            return account_id;
        }
    
        public void setAccount_id(String account_id) {
            this.account_id = account_id;
        }
    
        public String getTx_id() {
            return tx_id;
        }
    
        public void setTx_id(String tx_id) {
            this.tx_id = tx_id;
        }
    
        public String getCustomer_name() {
            return customer_name;
        }
    
        public void setCustomer_name(String customer_name) {
            this.customer_name = customer_name;
        }
    
        public String getTx_time() {
            return tx_time;
        }
    
        public void setTx_time(String tx_time) {
            this.tx_time = tx_time;
        }
    
        public int getTx_value() {
            return tx_value;
        }
    
        public void setTx_value(int tx_value) {
            this.tx_value = tx_value;
        }
    
        public long getAccount_overage() {
            return account_overage;
        }
    
        public void setAccount_overage(long account_overage) {
            this.account_overage = account_overage;
        }
    
        public int getTx_type() {
            return tx_type;
        }
    
        public void setTx_type(int tx_type) {
            this.tx_type = tx_type;
        }
    
        public String getOther_side_account() {
            return other_side_account;
        }
    
        public void setOther_side_account(String other_side_account) {
            this.other_side_account = other_side_account;
        }
    
        public String getTx_site() {
            return tx_site;
        }
    
        public void setTx_site(String tx_site) {
            this.tx_site = tx_site;
        }
    
        public String getSummary() {
            return summary;
        }
    
        public void setSummary(String summary) {
            this.summary = summary;
        }
    }
2. 数据操作在AccountTxMapper类中,配置信息在AccountTxMapper.xml中

AccountTxMapper类具体信息如下:

    package com.sequoiadb.cs.mapper;
    import java.util.List;
    import java.util.Map;
    
    import com.sequoiadb.cs.entity.AccountTx;
    
    public interface AccountTxMapper {
        public List queryAll(Map map) throws Exception;// 查询所有
    }

AccountTxMapper.xml具体信息如下:

    
    
    
        
            
            
            
            
            
            
            
            
            
            
        
        
    
3. Service完成具体的业务逻辑,AccountTxService类定义具体需完成的业务接口,AccountTxServiceImpl类继承AccountTxService完成具体的业务操作。

AccountTxService接口具体信息如下:

    package com.sequoiadb.cs.service;
    
    import java.util.List;
    import java.util.Map;
    
    import com.sequoiadb.cs.entity.AccountTx;
    
    public interface AccountTxService {
        public List queryAll(Map map) throws Exception;// 查询所有
    }

AccountTxServiceImpl具体实现如下:

    package com.sequoiadb.cs.service.impl;
    
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.sequoiadb.cs.entity.AccountTx;
    import com.sequoiadb.cs.mapper.AccountTxMapper;
    import com.sequoiadb.cs.service.AccountTxService;
    
    @Service("accountTxService")
    public class AccountTxServiceImpl implements AccountTxService {
    
        @Autowired
        private AccountTxMapper accountTxMapper;
    
        @Override
        public List queryAll(Map map) throws Exception {
            return accountTxMapper.queryAll(map);
        }
    }
4. Controller完成视图的响应以及各种用户动作业务的实现,具体实现在AccountTxController类中,具体信息如下:
    package com.sequoiadb.cs.controller;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import com.sequoiadb.cs.entity.AccountTx;
    import com.sequoiadb.cs.service.AccountTxService;
    import com.sequoiadb.cs.utils.JSONUtils;
    
    @Controller
    @RequestMapping("/accountTx")
    public class AccountTxController {
        @Autowired
        private AccountTxService accountTxService;
        
        @RequestMapping(value = "/query", method = { RequestMethod.POST})
        @ResponseBody
        public String queryAll(HttpServletRequest request,HttpServletResponse response) throws Exception {
            String tx_id = request.getParameter("tx_id");
            String account_id = request.getParameter("account_id");
            String sEcho = null;
            int pageNum = 0; // 起始索引
            int pageSize = 0; // 每页显示的行数
            JSONArray jsonarray = JSONArray.fromObject(request.getParameter("aoData"));
            for (int i = 0; i < jsonarray.size(); i++) {
                JSONObject obj = (JSONObject) jsonarray.get(i);
                if (obj.get("name").equals("sEcho"))
                    sEcho = obj.get("value").toString();
         
                if (obj.get("name").equals("iDisplayStart"))
                    pageNum = obj.getInt("value");
         
                if (obj.get("name").equals("iDisplayLength"))
                    pageSize = obj.getInt("value");
            }
            PageHelper.startPage(pageNum, pageSize);
            Map map = new HashMap();
            if(tx_id != null && tx_id.length() > 0){
                map.put("tx_id", Long.parseLong(tx_id));
            }
            if(account_id != null && account_id.length() > 0){
                map.put("account_id", Long.parseLong(account_id));
            }
            List accountTxList = accountTxService.queryAll(map);
    
            PageInfo pagehelper = new PageInfo(accountTxList);
    
            int  initEcho = Integer.parseInt(sEcho)+1;
            Map dataMap = new HashMap();    
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("iTotalRecords", pagehelper.getTotal());
            jsonObject.put("sEcho",initEcho);
            jsonObject.put("iTotalDisplayRecords", pagehelper.getTotal());
            jsonObject.put("aaData", pagehelper.getList());
            JSONUtils.toJSONString(dataMap);
            return jsonObject.toString();
        }
        private void sendJsonData(HttpServletResponse response, String data)throws IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out;
            out = response.getWriter();
            out.println(data);
            out.flush();
            out.close();
        }
    }
5. 本项目主要演示从SequoiaDB数据库中,通过SequoiaDB SSQL查询数据并且分页,由于篇幅较大具体前端页面代码不在此展示,可参考附件中index.jsp文件中的源码。具体查询功能结果展示如下图:

总结

从上述整合过程可以看出,Spring整合SequoiaDB SSQL套件和Spring整合其他数据库如PostgreSQL数据库流程一致。整合过程中主要是根据持久层框架的选择如MyBatis、Hibernate来确定Spring的配置信息,并且在持久层框架确定后需将SequoiaDB的Java驱动jar包添加到项目中。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38753.html

相关文章

  • [直播视频] 《Java 微服务实践 - Spring Boot 系列》限时折扣

    摘要:作为微服务的基础设施之一,背靠强大的生态社区,支撑技术体系。微服务实践为系列讲座,专题直播节,时长高达小时,包括目前最流行技术,深入源码分析,授人以渔的方式,帮助初学者深入浅出地掌握,为高阶从业人员抛砖引玉。 简介 目前业界最流行的微服务架构正在或者已被各种规模的互联网公司广泛接受和认可,业已成为互联网开发人员必备技术。无论是互联网、云计算还是大数据,Java平台已成为全栈的生态体系,...

    Enlightenment 评论0 收藏0
  • [直播视频] 《Java 微服务实践 - Spring Boot 系列》限时折扣

    摘要:作为微服务的基础设施之一,背靠强大的生态社区,支撑技术体系。微服务实践为系列讲座,专题直播节,时长高达小时,包括目前最流行技术,深入源码分析,授人以渔的方式,帮助初学者深入浅出地掌握,为高阶从业人员抛砖引玉。 简介 目前业界最流行的微服务架构正在或者已被各种规模的互联网公司广泛接受和认可,业已成为互联网开发人员必备技术。无论是互联网、云计算还是大数据,Java平台已成为全栈的生态体系,...

    winterdawn 评论0 收藏0
  • Java经典

    摘要:请注意,我们在聊聊单元测试遇到问题多思考多查阅多验证,方能有所得,再勤快点乐于分享,才能写出好文章。单元测试是指对软件中的最小可测试单元进行检查和验证。 JAVA容器-自问自答学HashMap 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础。但一个这么重要的东西,我为什么没有在一开始...

    xcold 评论0 收藏0
  • 2019 Java 全栈工程师进阶路线图,一定要收藏

    摘要:结合我自己的经验,我整理了一份全栈工程师进阶路线图,给大家参考。乾坤大挪移第一层第一层心法,主要都是基本语法,程序设计入门,悟性高者十天半月可成,差一点的到个月也说不准。 技术更新日新月异,对于初入职场的同学来说,经常会困惑该往那个方向发展,这一点松哥是深有体会的。 我刚开始学习 Java 那会,最大的问题就是不知道该学什么,以及学习的顺序,我相信这也是很多初学者经常面临的问题。​我...

    wangdai 评论0 收藏0
  • Java入门基础知识点总结(详细篇)

    摘要:深入理解数据库管理系统通用知识及数据库的使用与管理。为后台开发打下坚实基础。项目文档,项目规范,需求分析,数据库设计,工程构建,需求评审,配置管理,修复,项目管理等。 很多新手在学习java的时候都比较迷茫,不知道从哪里开始学起,这里就给大家整理了一份java开发学习路线,比较系统全面,可参...

    shinezejian 评论0 收藏0

发表评论

0条评论

awkj

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<