@TOC巨杉数据库学习笔记+项目实践心得
SequoialDB简介
SequoiaDB 巨杉数据库是一款金融级分布式数据库,主要面对高并发实时处理型场景提供高性能、可靠稳定以及无限水平扩展的数据库服务。
用户可以在 SequoiaDB 巨杉数据库中创建多种类型的数据库实例,以满足上层不同应用程序各自的需求。SequoiaDB 巨杉数据库支持 MySQL、MariaDB、PostgreSQL 和 SparkSQL 四种关系型数据库实例、JSON 文档类数据库实例、以及 S3 对象存储的非结构化数据实例。
学习笔记
在系统学习巨杉数据库的相关知识后,我考取了巨杉认证的SCDA和SCDP证书,在整个学习过程中,我对分布式数据库的认识进一步加深,对巨杉数据库的基本操作和产品特点进一步了解,为了加强对这些知识点的记忆,我写下一些学习笔记用于分享及然后自己的复习。
1、系统架构
SequoiaDB 巨杉数据库集群分为数据库存储引擎与数据库实例。
在当前版本中,SequoiaDB 巨杉数据库支持多达 6 种不同数据服务实例,包括针对结构化数据的 MySQL、MariaDB、PostgreSQL 与 SparkSQL 实例;针对半结构化数据的 JSON 实例;以及针对非结构化数据的 S3 对象存储实例。
SequoiaDB 巨杉数据库的数据库存储引擎则包括协调节点、编目节点与数据节点三种类型的服务。数据节点与编目节点各自以多副本的形式构成一个个复制组。
数据库存储引擎与数据库实例均支持水平弹性扩展,任何角色的节点均提供高可用冗余机制,不存在单点故障的可能。
2、SequoialDB的环境配置与安装部署
3、SQL实例安装
针对自己想要创建的数据库实例,下载好对应的数据库实例组件,这里以安装MYSQL实例组件为例。
安装步骤可参照:MYSQL实例组件安装部署
4、注意点(个人在安装过程中遇到的一些小问题)
1、关于Ubantu系统的磁盘扩容。SequoialDB部署在linux系统中,在安装过程中可能遇见虚拟机磁盘不够的问题。解决办法是先拓展磁盘空间,再利用文件分区管理软件(如GParted)重新分配磁盘空间。
2、在linux终端里操作时,要记住一些基本命令:
su - sdbadmin//切换sdbadmin用户
bin/sdb_sql_ctl addinst myinst -D database/3306/ //在对应数据库实例安装目录下创建数据库实例
/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root //登陆mysqlsheel,连接mysql实例,随后可进行mysql数据库操作
sdb //进入SequoialDB sheel(SequoialDB数据存储引擎)
var db = new Sdb("localhost", 11810);//使用javascript 语法连接协调节点,获取数据库连接
db.company.employee.find(); //随后可对数据库进行CRUD操作
巨杉数据库实操项目
为了加强对巨杉数据库的应用理解,我和另外一个同学合作,制作了一个基于分布式数据库SequoialDB的文件管理存储系统。我主要负责Spingboot框架的dao层中对数据库内容进行操作代码的编写。
1、项目背景
为了应对电脑中越来越多的各类资料,本项目所开发了基于分布式数据库的文件存储应用,可以将我们的本地文件分类存储到巨杉数据库中,代替传统的本地存储,减少本地存储资源的占用。本应用的基本功能有:文件浏览,上传,下载,搜索,复制、删除等。
2、开发工具
开发软件:JDK8.0、IDEA
开发框架:SpringBoot
开发语言:Java、HTML、Javascript、css
数据库:SequoiaDB v5
虚拟机环境:ubantu16.04
数据库连接工具:navicat
3、功能演示
1、主页面
2、具体功能
1、上传文件
2、删除文件
3、重命名
4、预览文件
5、下载文件
5、由于篇幅原因,其它功能如复制、移动文件的截图就不放了。
3、代码实现
这里我主要介绍一下自己负责的数据库功能代码部分。
1、删除数据库中的文件
//删除文件
public String delete(String filetype, String name){
Connection connection = null;
Statement statement = null;
FileInputStream fis = null;
//连接数据库
try{
//启动JDBC驱动
Class.forName(DRIVER);
//连接数据库
connection = DriverManager.getConnection(URL, user, pwd);
statement = connection.createStatement();//mysql语句
String delete ="delete from "+filetype+" where name = ?;";
//创建执行器
PreparedStatement ps =connection.prepareStatement (delete);
ps.setString(1,name);//删除数据
ps .executeUpdate();
ps.close();
connection.close();
fis.close();
}
catch (SQLException | ClassNotFoundException | IOException e) {
e.printStackTrace();
}
finally {
try {
if (statement != null)statement.close();
if(connection!=null)connection.close();
}
catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return "删除成功";
}
2、重命名文件
//重命名
public String rename(String filetype, String oldname,String newname){
Connection connection = null;
Statement statement = null;
//连接数据库
try {
//启动JDBC驱动
Class.forName(DRIVER);
//连接数据库
connection = DriverManager.getConnection(URL, user, pwd);
statement = connection.createStatement();
//mysql语句
String update = "update "+filetype+ " set name=? where name=?;";
//创建执行器
PreparedStatement ps = connection.prepareStatement(update);
ps.setString(1,newname);
ps.setString(2,oldname);
//更新数据
ps.executeUpdate();
ps.close();
connection.close();
}catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
finally {
try {
if (statement != null)statement.close();
if(connection!=null)connection.close();
}
catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return "文件重命名成功";
}
3、文件预览
public class Content{
String name;
Long size;
String date;
FileInputStream file;
public void setName(String name){
this.name=name;
}
public void setSize(Long size){
this.size=size;
}
public void setDate(String date){
this.date=date;
}
public void setFile(FileInputStream file){
this.file=file;
}
public FileInputStream getFile(){
return file;
}
}
//预览文件
public ArrayList getdisplay(String filetype, String name){
Connection connection = null;
Statement statement = null;
ArrayList list = new ArrayList();
//连接数据库
try {
//启动JDBC驱动
Class.forName(DRIVER);
//连接数据库
connection = DriverManager.getConnection(URL, user, pwd);
statement = connection.createStatement();
//mysql语句
String query = "select * from "+filetype+ " where name=?;";
//创建执行器
PreparedStatement ps = connection.prepareStatement(query);
ps.setString(1,name);
ResultSet rs = ps.executeQuery();
while(rs.next()){
Content con = new Content();
con.setName(rs.getString("name"));
con.setSize(rs.getLong("size"));
con.setDate(rs.getString("date"));
FileInputStream fis = null;
fis = (FileInputStream)rs.getBlob("fis").getBinaryStream();
con.setFile(fis);
list.add(con);
fis.close();
}
ps.close();
connection.close();
}
//下面是异常处理
catch (SQLException | ClassNotFoundException | IOException e) {
e.printStackTrace();
}
return list;
}
4、从数据库下载文件到指定路径
//下载文件
public void download(String filetype,String path, String name){
FileInputStream fis = null;
ArrayList arraylist = new ArrayList();
//获取文件内容(预览方法返回内容)
arraylist = getdisplay(filetype,name);
Content content = (Content)arraylist.get(0);
String file_path=path+name;
//获取文件信息
fis = content.getFile();
try{
byte[] fis_byte=read(fis);
FileOutputStream fileOutputStream=new FileOutputStream(new File(file_path));
fileOutputStream.write(fis_byte);
fileOutputStream.close();
}catch (IOException e) {
e.printStackTrace();
}
}
//将inputstream转化为byte[]
public static byte[] read(InputStream inputStream) throws IOException {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int num = inputStream.read(buffer);
while (num != -1) {
baos.write(buffer, 0, num);
num = inputStream.read(buffer);
}
baos.flush();
return baos.toByteArray();
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}