自动将node.js对象持久化到数据库中

5
在使用 node.js 对象(数组、映射等)进行一些数据索引实验时(从数据库中获取数据需要一定时间),我希望我的 node.js 对象可以自动透明地保存在数据库中。
我已经使用过 MongoDB 以及其他数据库(包括基于 SQL 的数据库)一段时间了,我非常清楚 JavaScript 对象(同步访问,没有查询)和数据库记录(异步访问,查询等)之间的查询/更新机制非常不同。但是,我仍然希望存在一种解决方案,使 JavaScript 变量至少对于索引而言是持久的,并且有所帮助。
基本上,我想到的是类似于 HTML5 的 LocalStorage,但用于 node.js 服务器。
你认为这个想法有趣、可行,或者它已经存在了吗?
编辑:正在进行中的工作:https://github.com/adrienjoly/persistent-harmony

看起来我的梦想解决方案将依赖于代理(ES6):https://dev59.com/vGgv5IYBdhLWcg3wW_d_ - Adrien Joly
3个回答

3
首先要明确的一件事是,数据库有两个目的:持久性和方便/高效查询。
如果您只需要第一个目的,因为您绝对知道没有其他程序将访问您的持久数据,那么您可以查看关于正交持久性的文献,这正是您在此建议的概念。一个例子是成功实现在WaterKen Java服务器中的KEN协议。 有一些工作正在整合协议到Google的V8 JavaScript运行时中,这可能会导致具有正交持久性的Node.js - Nodeken。
获得正确的正交持久性的困难之一是将事务语义映射到诸如面向对象编程系统之类的系统上。 V8-ken采取的方法是将JavaScript运行时的单个事件循环执行视为事务。换句话说,在某些事件(传入web请求,服务器回复,用户界面事件,所有异步操作(IO)等)的响应结束时,虚拟机的状态被持久化。然而,这需要修改后的运行时,例如V8-ken,但ECMAScript中的发展,例如代理,看起来有希望更方便地实现这些功能。
在许多情况下(例如Web应用程序),持久数据需要被不同的程序访问,需要一个“真正”的数据库使得数据易于导出、迁移、查询等。当然,混合方法也是可能的...

感谢 Andoni 向我介绍“正交持久性”和 V8-Ken!我相信这种方法对于可能随时重新启动的嵌入式应用程序非常有趣,因此它们可以即时恢复到之前的状态,而不需要代码开销。在我的情况下,我不需要与其他应用程序共享数据,但我希望指定要持久化的变量。同时,保证持久化的时间效率尽可能高也很重要。 - Adrien Joly

2
也许这正是你需要的东西? https://github.com/yangli1990/flydb 或者
npm install flydb

现在在JavaScript中
var flydb = require('flydb');

flydb.test = "hello world";  //flydb.test will now persist

要运行这个程序
node --harmony-proxies <your commands>

例如:

node --harmony-proxies 应用程序


2
%> npm search persistent storage
closet                JSON persistent storage with methods chainability and callbacks for asynchronous use. =ganglio 2013-01-29 18:41  0.0.7  json persistent storag
ewdDOM                Persistent lightweight DOM using Mumps Global Storage         =robtweed        2013-02-02 14:39  0.0.4
fs-persistent-object  Tiny Node library for persisting small runtime objects on filesystem =oleksiyk 2013-04-09 09:13  0.0.1  persistent tiny storage
headstorage           A persistent storage for Node.js                              =headhsu2568     2012-11-20 13:41  0.0.0  storage
level-store           A streaming storage engine based on LevelDB.                  =juliangruber    2013-06-21 19:55  3.3.2  leveldb levelup stream persistent
node-persist          Super-easy (and fast) persistent data structures in Node.js, modeled after HTML5 localStorage =benmonro 2013-04-09 17:33  0.0.1  node persist
persistent-hash-trie  Pure string:val storage, using structural sharing             =hughfdjackson   2013-05-24 19:24  0.4.1  persistent hash trie pure functional d
perstore              Perstore is a cross-platform JavaScript object store interface for mapping persistent objects to various different storage mediums using an in
shelf.js              A modular, powerful wrapper library for persistent objects in the browser and Node.js =shakty 2013-05-24 08:10  0.4.7  persistance localStorag
stay                  Persistent scuttlebutt instances for browser and node         =juliangruber    2012-12-11 21:54  0.1.0  persistent scuttlebutt persistence loc

看起来最接近的匹配应该是node-persist =)
编辑:这里可能有一个更好的替代方案...
@adrienjoly你知道原型仍然相当高级,可能(从长远来看)不如您想象的那么有效。
您可以开发一个C / C ++模块,公开一个node.js的高级API来利用。
我认为我有一个关于如何涉足这种类型的node.js开发的帖子(它源自我在这里遵循的原始教程)
我确信那种方法已经过时了,使用node-gyp工具是一种较新的方法。一些其他的资源和例子:node-gyp项目uRSA(我有一个小的pull请求与这个),bcrypt等。
我在此的假设是,您可以将模块扩展绑定到诸如oracle或postgres等的db api,并编写一个低级模块,连接到低级API,同时通过API调用公开高级API以实现持久配置选项,例如切片、索引等,从而优化性能,而不是尝试让node.js解释您的原型外壳。

谢谢,@jas!我会看看所有这些模块的。然而,我认为node-persist不允许使用本地js运算符([],=等)来操作持久化对象。这很让人失望... - Adrien Joly
以下是您列出的模块的概述:
  • 以下模块依赖于getter/setter、显式同步函数或使用间隔进行定期比较...:closet、headstorage、node-persist、persistent-hash-trie、perstore、shelf.js
  • 以下模块适用于更特定的情况(包括太小的对象):ewdDOM、level-store、stay、fs-persistent-object
- Adrien Joly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接