AvenirSQL

基于 Node.js 的数据库
授权协议 GPL-2.0
开发语言 JavaScript TypeScript
所属分类 数据库相关、 数据库服务器
软件类型 开源软件
地区 国产
投 递 者 松昱
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

AvenirSQL是一个用Node.js设计的数据库,支持常见的SQL语句。

技术特点

  • 1.支持增删改查
  • 2.精确查找支持哈希索引,范围查找支持B+树索引
  • 3.智能缓存,提升QPS性能
  • 4.提供用户管理,cli程序(curl.js)
  • 5.实现串行锁功能
  • 6.灵活的策略配置

具体技术实现

  • 1.统一的底层错误处理函数,避免函数重复传递参数。
async response(type, client) {
        let res = null;
        if (typeof type == 'string') {
            res = getError(type);
            if (!res) {
                res = unknown;
            }
        } else {
            let code = type.code;
            let data = type.data;
            res = getError(code);
            if (!res) {
                res = unknown;
            }
            res.data = data;
        }
        client.write(JSON.stringify(res));
        //如果没有配置默认短连接

        if( ini.db.keepAlive != true) {
            toLog("主动踢掉客户端的连接");
            client.end();
        }
    }

2.数据库结构

数据库:文件夹名

表:数据文件、哈希索引文件、B+树索引文件(聚合索引)

  • 数据文件:

    第一行存放表结构定义,第二行开始第一位为压缩的16进制数,表示该行元素是否为空,后续存储按分隔符排列。

  • 哈希索引:

    对象,key为主键,value为所在文件的行号

  • B+树索引:

    存放B+树的结构

3.连接管理

为了区分不同的用户对数据库进行的不同操作,如同一秒内多个进程进行多次请求,AvenirSQL会生成一个签名,用户登录后需使用此签名进行操作。

4.串行锁

进行操作前加锁,操作完成后解锁,并刷新缓存(select语句不会刷新缓存)

//自动释放锁防止数据库死锁
    async releaseLock() {
        let now = moment().valueOf();
        let releaseLockTime = ini.db.releaseLockTime;
        releaseLockTime = releaseLockTime > ini.db.checkLockTime ? releaseLockTime : ini.db.checkLockTime;
        for(let key in this.table) {
            let tables = this.table[key];
            for(let subKey in tables) {
                let times = tables[subKey];
                if(moment(now).diff(moment(times),'seconds') > releaseLockTime) {
                    delete tables[subKey];
                    toLog("自动释放了锁 ",tables[subKey]);
                }
            }
        }
    }

5.缓存

目前共五类缓存,数据库配置文件缓存和表结构缓存不会刷新,哈希索引、表数据、B+树索引缓存会定时刷新。

6.解析SQL

在此感谢阿里巴巴的sql解析器 node-sqlparser

AvenirSQL独有的sql会先解析,除此之外的SQL会转交给node-sqlparser。

//包含原生SQL和能够被AvenirSQL识别的语句
    async parse(sql, sign) {
        //先解析AvenirSQL特有的语句 再解析原生SQL
        toLog("要解析的 sql为 ", sql);
        let raw = this.getArray(sql);
        if (raw.length === 0 || !sql) {
            throw ('SQL_PARSE_ERROR');
        } else {
            //AvenirSQL解析出错不报错,转给解析器解析,解析器报错直接throw
            try {
                await this.parseAvenirSql(raw, sql, sign);
            } catch (error) {
                //不是内部定义的错误就代表程序处理出错了
                toLog('error = ', error);
                if (error == SUCCESS || error != 'error') {
                    throw (error);
                }

                //不需要try catch了,底层会抓住错误
                let par = this.parseSql(sql);
                await this.doSql(par, sign);

            }
        }
    }
 相关资料
  • 本文向大家介绍基于Docker的PHP调用基于Docker的Mysql数据库,包括了基于Docker的PHP调用基于Docker的Mysql数据库的使用技巧和注意事项,需要的朋友参考一下 docker简介: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不

  • 我如何才能显示一个包含姓名、性别和出生日期的数据表,而只显示今天出生的人? 使用来自jdbc的java连接。 也就是说,我有一张分别于2015年6月15日、2015年5月13日和2015年6月17日出生的3个孩子的表格。 逻辑执行后,只有一个DOB在2015年6月17日(今天的日期)的孩子会出现在桌面上。

  • 问题内容: 我知道有三种不同的,流行的非SQL数据库类型。 键/值:Redis,Tokyo Cabinet,Memcached ColumnFamily:Cassandra,HBase 文件:MongoDB,CouchDB 我已经读了很长的博客,但对它的了解却很少。 我知道关系数据库,并且在MongoDB / CouchDB等基于文档的数据库中徘徊。 谁能告诉我这些和清单上的两个前者之间的主要区别

  • 基于FMDB的数据库增删改查Demo。其中包括 statusBar 上显示Log的用法。仅支持ARC。比较适合新手。 [Code4App.com]

  • 我想让我的web应用程序使用mongodb和spring data multitenat。 基本上,我希望将所有实体(集合)复制到不同的数据库中。然后(基于一些规则,例如登录系统的用户),我想将一些实体实例(文档)存储到正确的数据库中。 例如,我有一个名为DBNameProviderService的服务。动态返回数据库名称的getDbName()。如何使用此服务动态选择正确的数据库? 编辑 抱歉,

  • 问题内容: 是否有任何库在Java中创建使用文件作为数据库的程序,而不必在要使用它的计算机上安装数据库服务? 问题答案: Derby和Hypersonic SQL均可在内存和服务器模式下运行。