介绍
南大通用旗下有多个数据产品,产品种类丰富,满足所有的数据业务场景。GBase是一个自主研发的商业闭源软件品牌,兼具OLTP和OLAP特性,南大通用一直紧跟潮流,跟上先进技术进行消化理解推陈出新,Gbase 8C就是其中一个代表作品。但是南大通用它没有选择把自己的产品开源,在技术布道上受众较少。
南大通用产品线如下
-
分析型数据管理系统GBase 8a
-
交易型数据管理系统GBase 8s
-
极速内存数据库集群管理系统GBase XDM
-
目录服务系统GBase 8d
-
统一数据平台GBase UP
-
多模多态数据库GBase 8c
本文主要介绍GBase 8a和GBase 8s的开发实践入门,8a和8s是南大通用的拳头产品,通过环境搭建到实践的代码实践应用,主要介绍了基于GBase的JAVA、javascript、python接入应用开发,除此之外GBase也支持go和C++的开发,但是JAVA、javascript、python更偏向应用。
下面的代码都已经经过验证测试,在百度云上就可以下载。
安装
安装环境前提服务器必须首先安装docker
GBase 8a
docker安装体验8a,只需要5步
第一步拉取镜像
docker pull shihd/gbase8a:1.0
第二步运行镜像
docker run -it --name gbase8a --hostname=gbase8a --privileged=true -p5258:5258 shihd/gbase8a:1.0
第三步跳入容器
docker exec -it gbase8a /bin/bash
第四步,登录gbase,输入密码root,
gbase -uroot –p
第五步创建数据库test8a
gbase> create database test8a;
数据库连接信息
jdbc url: jdbc:gbase://xxxx:5258/test8a?user=root&password=root
ip: xxxx
port: 5258
database: test8a
user: root
password: root
GBase 8s
GBase 8s安装体验只需要2步
第一步拉取镜像 docker pull liaosnet/gbase8s:3.3.0_2_amd64 第二步运行镜像 docker run -itd -p 19088:9088 liaosnet/gbase8s:3.3.0_2_amd64 数据库连接信息 driver: com.gbasedbt.jdbc.Driver jdbc url:jdbc:gbasedbtsqli://host:19088/testdb:GBASEDBTSERVER=gbase01;DB_LOCALE=zh_CN.utf8;CLIENT_LOCALE=zh_CN.utf8;IFX_LOCK_MODE_WAIT=30; username:gbasedbt password:GBase123
代码
选择主流语言java、nodejs、python对GBase 8a和GBase 8s操作
GBase 8a
JAVA
建议安装jdk1.8版本以上,另外需要gbase-connector-java-8.3.81.53-build55.2.1-bin.jar包,
IDEA引入8a的依赖,如下图

CRUD的示例代码
package henley;
import com.gbase.jdbc.Connection;
import com.gbase.jdbc.Statement;
import com.gbase.jdbc.StatementImpl;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Created @author angryart 亨利
**/
public class GbaseEntry {
public static void main(String[] args) throws Exception {
String URL = "jdbc:gbase://xxxx:5258/test8a?user=root&password=root";
Class.forName("com.gbase.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection(URL);
Statement stat = (Statement) con.createStatement();
try {
String dropsql = "drop table if exists t8a";
String createsql = "create table t8a(id int, name varchar(50))";
String insertsql = "insert into t8a (id,name) values(1,'test1')";
String selectsql = "select * from t8a";
String updatesql = "update t8a set name='test1_update' where id = 1 ";
String deletesql = "delete t8a where id = 1 ";
stat.execute(dropsql);
stat.execute(createsql);
stat.execute(insertsql);
ResultSet rs = stat.executeQuery(selectsql);
while (rs.next()) {
System.out.println("t8a表 列值ID是==>" + rs.getString(1));
System.out.println("t8a表 列值NAME是==>" + rs.getString(2));
}
stat.execute(updatesql);
rs = stat.executeQuery(selectsql);
while (rs.next()) {
System.out.println("修改后的t8a表 列值ID是==>" + rs.getString(1));
System.out.println("修改后的t8a表 列值NAME是==>" + rs.getString(2));
}
stat.execute(deletesql);
} catch (SQLException ex) {
ex.printStackTrace();
System.out.println(ex.getErrorCode());
System.out.println(ex.getMessage());
// throw ex;
}
}
}
nodejs
安装nodejs环境,引入mysql包
笔者用的nodejs是v10.15.3,环境从以下的地方下载
https://nodejs.org/en/download
运行以下命令安装mysql相关包,就可以在代码层引用。
npm install mysql
示例代码如下
var gb = require('mysql');
// 数据库配置
var config = {
user: 'root',
database: 'test8a',
password: 'root',
host: 'xxxx',
port: 5258,
}
// 创建连接池
var connection = gb.createConnection(config);
connection.connect();
var sql = "select * from t8a";
connection.query(sql, (err, results) => {
if (err) return console.log(err.message)
console.log(results)
}
);
var insertsql = 'INSERT INTO t8a(id,name) VALUES(?,?)';
var addSqlParams = [1,'heley_yang'];
connection.query(insertsql, addSqlParams, function (err, result) {
if(err){
console.log('[INSERT ERROR] - ',err.message);
return;
}
console.log('--------------------------INSERT----------------------------');
console.log('INSERT ID:',result);
})
var updateSql = 'UPDATE t8a SET name = ? WHERE id = ?';
var updateSqlParams = ['nodejs_update', '1'];
connection.query(updateSql, updateSqlParams, function (err, result) {
if(err){
console.log('[UPDATE ERROR] - ',err.message);
return;
}
console.log('--------------------------UPDATE----------------------------');
console.log('UPDATE affectedRows',result.affectedRows);
})
var deleteSql = 'DELETE FROM t8a where id=1';
connection.query(deleteSql,function (err, result) {
if(err){
console.log('[DELETE ERROR] - ',err.message);
return;
}
console.log('--------------------------DELETE----------------------------');
console.log('DELETE affectedRows',result.affectedRows);
});
connection.end();
python
安装python3.X版本以上,并引入pymysql包 pip install pymysql,
import pymysql
class DataBaseHandle(object):
''' 定义一个 MySQL 操作类'''
def __init__(self,host,username,password,database,port):
'''初始化数据库信息并创建数据库连接'''
# 下面的赋值其实可以省略,connect 时 直接使用形参即可
self.host = host
self.username = username
self.password = password
self.database = database
self.port = port
self.db = pymysql.connect(self.host,self.username,self.password,self.database,self.port,charset='utf8')
def insertDB(self,sql,value):
''' 插入数据库操作 '''
self.cursor = self.db.cursor()
try:
# 执行sql
# self.cursor.execute(sql)
tt = self.cursor.execute(sql,value) # 返回 插入数据 条数 可以根据 返回值 判定处理结果
print(tt)
self.db.commit()
except:
# 发生错误时回滚
print("rollback")
self.db.rollback()
finally:
self.cursor.close()
def deleteDB(self,sql):
''' 操作数据库数据删除 '''
self.cursor = self.db.cursor()
try:
# 执行sql
self.cursor.execute(sql)
# tt = self.cursor.execute(sql) # 返回 删除数据 条数 可以根据 返回值 判定处理结果
# print(tt)
self.db.commit()
except:
# 发生错误时回滚
self.db.rollback()
finally:
self.cursor.close()
def updateDb(self,sql):
''' 更新数据库操作 '''
self.cursor = self.db.cursor()
try:
# 执行sql
self.cursor.execute(sql)
# tt = self.cursor.execute(sql) # 返回 更新数据 条数 可以根据 返回值 判定处理结果
# print(tt)
self.db.commit()
except:
# 发生错误时回滚
self.db.rollback()
finally:
self.cursor.close()
def selectDb(self,sql):
''' 数据库查询 '''
self.cursor = self.db.cursor()
try:
self.cursor.execute(sql) # 返回 查询数据 条数 可以根据 返回值 判定处理结果
data = self.cursor.fetchall() # 返回所有记录列表
print(data)
# 结果遍历
for row in data:
sid = row[0]
name = row[1]
# 遍历打印结果
print('sid = %s, name = %s'%(sid,name))
except:
print('Error: unable to fecth data')
finally:
self.cursor.close()
def closeDb(self):
''' 数据库连接关闭 '''
self.db.close()
if __name__ == '__main__':
insertsql='insert into t8a (id,name) values(%s,%s)'
insertValue=(1,'henley')
DbHandle = DataBaseHandle('xxxx','root','root','test8a',5258)
DbHandle.insertDB(insertsql,insertValue)
DbHandle.selectDb('select * from t8a')
DbHandle.updateDb('update t8a set name = "%s" where id = "%d"' %('YeKai',1))
DbHandle.selectDb('select * from t8a')
DbHandle.deleteDB('delete from t8a where sid > "%d"' %(2))
DbHandle.selectDb('select * from t8a')
DbHandle.closeDb()
除此之外,南大通用也有自己的python驱动,名称是gbase-connector-python-3.0.1_forpy3.6.tar.zip,
笔者基于 3.6.5平台,运行以下命令就可以进行安装
C:\gbase\2023年第一届\gbase-connector-python-3.0.1>python setup.py install
测试代码,使用官方的python可以有更友好的功能。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@Time Date : 2023/5/22 11:19
@Author : angryart
@File : gbasetest
@PROJECT_NAME : learnPython
"""
from GBaseConnector import connect,GBaseError
config = {'host':'xx.xx.xx.xx','port':5258,'database':'test8a',
'user':'root','passwd':'root'}
try:
conn = connect()
conn.connect(**config)
cur = conn.cursor()
cur.execute("select * from t8a")
rows = cur.fetchall()
for row in rows:
print(row)
except GBaseError.DatabaseError as e:
print(e)
finally:
conn.close()
GBase 8s
建议jdk1.8以上,引入GBase 8sv8.7_2.0.1a2_1 JDBC.jar
8s和8a的区别主要是jdbc url连接符不同,大体上他们是一样的。
package test.henley;
import java.sql.*;
/**
* Created @author 亨利先生 by @date
**/
public class Gbase8sEntry {
public static void main(String[] args) throws Exception {
String URL = "jdbc:gbasedbt-sqli://xxxx:19088/testdb:GBASEDBTSERVER=gbase01;DB_LOCALE=zh_CN.utf8;CLIENT_LOCALE=zh_CN.utf8;IFX_LOCK_MODE_WAIT=30;";
String username = "gbasedbt";
String password = "GBase123";
Class.forName("com.gbasedbt.jdbc.Driver");
Connection con = DriverManager.getConnection(URL,username,password);
Statement stat = con.createStatement();
try {
String dropsql = "drop table if exists t8s";
String createsql = "create table t8s(id int, name varchar(50))";
String insertsql = "insert into t8s (id,name) values(1,'test1')";
String selectsql = "select * from t8s";
String updatesql = "update t8s set name='test1_update' where id = 1 ";
String deletesql = "delete t8s where id = 1 ";
stat.execute(dropsql);
stat.execute(createsql);
stat.execute(insertsql);
ResultSet rs = stat.executeQuery(selectsql);
while (rs.next()) {
System.out.println("gbase 8s表 列值ID是==>" + rs.getString(1));
System.out.println("gbase 8s表 列值NAME是==>" + rs.getString(2));
}
stat.execute(updatesql);
rs = stat.executeQuery(selectsql);
while (rs.next()) {
System.out.println("修改后的Gbase 8s表 列值ID是==>" + rs.getString(1));
System.out.println("修改后的Gbase 8s表 列值NAME是==>" + rs.getString(2));
}
stat.execute(deletesql);
} catch (SQLException ex) {
ex.printStackTrace();
System.out.println(ex.getErrorCode());
System.out.println(ex.getMessage());
}
}
}
总结
在应用开发的体验角度来看,Gbase 8a和Gbase 8s还是平易近人的,不仅有自己的标准的jdbc客户端驱动,而且生态上也兼容主流编程接口规范,安装简单,操作方便,在增删查改的开发上没有违和不适,由于没有开源,一些美好的特性不为外人知道,希望Gbase 多多技术布道,在国产数据库的道路上发展会更好。
介质及代码下载
相关代码和jdbc驱动包见百度云
链接:https://pan.baidu.com/s/1-GWGDB8fXAO-23L1Cco9Qw
提取码:g4ya




