来源:微信公众号【 无处不在的技术】,如需转载,请联系作者进行授权。
一、背景
SequoiaDB,即巨杉数据库,是目前国产数据库中还不错的一款数据库管理系统软件,数据库底层支持JSON的形式的数据结构存储,那么很自然大家就想到了MongoDB,根据我所了解的情况,目前很多使用了MongoDB数据库的银行或政府机构都开始把国外的某些数据库逐渐替换为国内的数据库,而对于国内使用MongoDB的机构,则有意愿替换成国产的巨杉数据库,有些已经完成数据库的迁移,有些正在做,有些即将开始。
说到这里,就出现了大家非常关注的问题:使用了MongoDB数据库的软件系统或应用平台,如何顺利的迁移到SequoiaDB数据库上?
本文会做一个简单的说明与教程。
根据官网上的解决方案(http://contrast.sequoiadb.com/cn/)介绍:有如下几个项目进行了巨杉数据库的改造与迁移:
1、某政府电子政务中心的数据平台
2、某银行对公知识图谱
3、某企业营销平台中的标签管理
4、某银行去中心化福费廷项目
从技术方面来讲,对于MongoDB项目迁移到SequoiaDB数据库时,大概有如下3种处理逻辑:
1、使用巨杉数据库的原生Java API,重写项目的数据库操作功能模块
2、基于原生Java API封装出第三方框架,便于快速开发,例如自主开发一套Spring Data SequoiaDB
3、使用某种中间层技术,完成数据库传输通信的自动兼容。
本文主要介绍第3种实现方案,因为这种处理逻辑的优点为:使用了Spring Data MongoDB的Java项目无需改动开发代码,可以快速完成应用系统的平滑迁移与改造。
二、环境准备
目前官方的社区版不支持MongoDB的兼容方式(未来可能某一天会发布出来),企业版是可以的,也就是说用企业版的巨杉数据库,可以兼容MongoDB,这句话的意思就是说:我们可以像使用MongoDB的方式或直接使用MongoDB的方式来操作和访问巨杉数据库,即用MongoDB的Java API来操作和访问巨杉数据库,目前这种处理逻辑可以满足常见的CRUD操作。所以我们需要如下环境:
(1)、企业版的巨杉数据库环境
(2)、兼容MongoDB访问的巨杉Fap驱动文件
本文不介绍巨杉数据库的安装操作,可以去看官网上的详细说明,目前官网上也开通了对于巨杉数据库SCDA、SCDP、SCDD相关的认证,感兴趣和有需要的同学可以去考一下。
1、在安装了企业版的巨杉数据库环境后,我们在命令行输入如下命令查看巨杉数据库的版本是否为企业版:
2、准备好mongodb兼容驱动文件:libfapmongo3.so文件,把这个文件放到巨杉安装目录下的bin目录,这里我的目录是/opt/sequoiadb/bin/fap目录下,然后找到巨杉数据库协调节点的配置文件,协调节点的配置文件的目录为:/opt/sequoiadb/conf/local/11810/,增加fap属性,并设置该驱动文件的位置,截图如下:
3、然后我们输入命令重新启动数据库即可,重新启动数据库的命令如下:
sdbstop -all
sdbstart -t all
是否启动成功,输入sdblist命令查看即可,如果存在启动失败的节点,则说明配置有误。启动成功后,默认会占用一个11817的端口,输入如下命令查看端口是否处于监听状态:
netstat -an | grep 11817
三、代码开发
在企业版的巨杉数据库设置好MongoDB的fap方式兼容以后,代码中就可以Spring Data MongoDB来操作和访问巨杉数据库。
1、首先我们在巨杉数据库中创建一个集合空间(即对应的MongoDB中数据库的概念)和一个集合,其中集合空间为:mongodb_test,
集合名称为:c_test_log,在linux命令行中输入su - sdbadmin切换用户,然后再执行sdb命令进入到巨杉数据库的控制台,然后分别输入如下命令:连接SDB、创建集合空间、创建集合、查询集合
var db = new Sdb("localhost",11810)
db.createCS("mongodb_test")
db.mongodb_test.createCL("c_test_log")
db.mongodb_test.c_test_log.find()
2、对于代码层面的开发,这里基于Spring Boot+Spring Data MongoDB框架进行操作,其中框架版本为:
Spring Boot:2.1.7
Spring Data MongoDB:2.1.10
MongoDB Driver 3.8.2
使用IDEA开发工具新创建一个Spring Boot项目,然后引入Spring Data MongoDB的开发包,本文的pom.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wxbz</groupId>
<artifactId>sdb-mongodb-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sdb-mongodb-test</name>
<description>SpringBoot+Spring Data MongoDB(To Access SequoiaD</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--spring data mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.7.RELEASE</version>
</plugin>
</plugins>
</build>
</project>
3、在application.yml文件中,设置巨杉数据库服务器的IP、端口和数据库信息,这里需要写上fap的11817端口,非11810端口,这个文件设置好以后程序中会自动注入MongoTemplate实例:
server:
port: 9091
spring:
data:
mongodb:
host: 192.168.4.108
port: 11817
database: mongodb_test
4、在entity包下面创建和c_test_log匹配的实体类,代码如下:
@Document(collection = "c_test_log")
public class TestLog implements Serializable {
private String logId;
private String content;
private String host;
private List<String> steps;
private int executeCount;
private Date createDate;
...省略getter/setter等方法
}
5、创建操作数据库的接口:
/**
数据库操作接口
@param <T>
*/
public interface ITestLogDao<T> {
public void save(T testLog);
public T getById(String id);
public List<T> getAll(Class<T> tClass);
public void deleteById(String id);
public void update(T testLog);
}
*
6、编写操作巨杉数据库的Dao层的实现类
/**
dao操作实现类
*/
@Repository
public class TestLogDaoImpl implements ITestLogDao<TestLog> {
/**
* 注入MongoTemplate实例,Spring Boot会自动处理
*/
@Autowired
private MongoTemplate mongoTemplate;
public MongoTemplate getMongoTemplate(){
return this.mongoTemplate;
}
@Override
public void save(TestLog testLog) {
this.getMongoTemplate().save(testLog);
}
@Override
public TestLog getById(String id) {
Criteria criteria = Criteria.where("logId").is(id);
return this.getMongoTemplate().findOne(new Query(criteria),TestLog.class);
}
@Override
public List<TestLog> getAll(Class<TestLog> testLogClass) {
return this.getMongoTemplate().findAll(TestLog.class);
}
@Override
public void deleteById(String id) {
Criteria criteria = Criteria.where("logId").is(id);
this.getMongoTemplate().remove(new Query(criteria),TestLog.class);
}
@Override
public void update(TestLog testLog) {
Criteria criteria = Criteria.where("logId").is(testLog.getLogId());
if(criteria != null){
Update update = new Update();
update.set("content", testLog.getContent());
update.set("executeCount",testLog.getExecuteCount());
this.getMongoTemplate().updateFirst( new Query(criteria), update,TestLog.class);
}
}
}
7、编写以下相关测试方法,编写测试保存方法代码如下:
@Test
public void saveTest(){
TestLog testLog = new TestLog();
testLog.setLogId(UUID.randomUUID().toString());
testLog.setContent("测试日志1");
testLog.setCreateDate(new Date());
testLog.setExecuteCount(15);
testLog.setSteps(Arrays.asList(new String[]{"第1个步骤","第2个步骤"}));
testLogDao.save(testLog);
System.out.println("******保存成功*********");
}
使用图形化测试工具MongoChef连接巨杉数据库服务器的11817端口,可以看到当前插入的数据,如下所示:
8、编写如下测试查询代码:
@Test
public void queryTest(){
List<TestLog> logList = testLogDao.getAll(TestLog.class);
System.out.println("******查询成功*********" + logList.get(0).getContent());
}
9、编写如下代码测试修改:
@Test
public void updateTest(){
TestLog testLog = new TestLog();
testLog.setLogId("09aa8294-2d94-44d3-8f8e-a798ce46e022");
testLog.setContent("测试日志1被修改");
testLogDao.update(testLog);
System.out.println("******修改成功*********");
}
使用图形化测试工具MongoChef连接巨杉数据库服务器的11817端口,可以看到当前被修改的测试数据
10、编写如下代码测试删除:
@Test
public void deleteTest(){
testLogDao.deleteById("09aa8294-2d94-44d3-8f8e-a798ce46e022");
System.out.println("******删除成功*********");
}
这样基本的CURD操作代码都验证完成,可以完成一些常见的操作,目前对于某些MongoDB某些特性的代码,我暂时没有测试和使用。
相信本篇文章的这些介绍,可以让大家知道本文的主题。
目前基本实现了使用Spring Data MongoDB框架来操作和访问巨杉数据库,前提是企业版的巨杉3.4,同时配置了FAP驱动文件。
相信在不久的将来,巨杉数据库完善了这个驱动文件后,应该会开放出来,毕竟中国使用MongoDB的机构也很多。
本文只是简单的介绍了基本的操作,如果其他想要进行了解的可以进行留言或评论。
如果想要学习巨杉数据库,可以去官网参加巨杉的SCDA、SCDP和SCDD的数据库认证,目前是免费的,作者已经获得了这三个证书还获得了对应的奖品,感兴趣的可以学习一下。
最后,希望本篇文章的介绍,可以让你从技术上了解下MongoDB的项目如何使用Spring Data MongoDB快速迁移到SequoiaDB上。
对文章感兴趣的同学,可以关注我的公众号,最近也计划写写巨杉数据库的文章。