AvenirSQL是一个用Node.js设计的数据库,支持常见的SQL语句。
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均可在内存和服务器模式下运行。