问题标签 [in-memory-database]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 从 Oracle 实例创建内存数据库结构
我有一个应用程序,其中许多“单元”测试在执行期间使用与 Oracle 数据库的真实连接。
可以想象,执行这些测试需要花费太多时间,因为它们需要初始化一些 Spring 上下文,并与 Oracle 实例通信。除此之外,我们必须管理复杂的机制,例如事务,以避免在测试执行后修改数据库(即使我们使用类似 Spring 的有用类AbstractAnnotationAwareTransactionalTests
)。
所以我的想法是用内存数据库逐步替换这个 Oracle 测试实例。我会使用hsqldb
或者更好h2
。
我的问题是知道什么是最好的方法来做到这一点。我主要关心的是内存数据库结构的构建和参考数据的插入。
当然,我可以从 Oracle 中提取数据库结构,使用SQL Developer
or之类的工具TOAD
,然后修改这些脚本以使其适应hsqldb
orh2
语言。但我认为这不是更好的方法。
事实上,我已经在另一个项目中使用hsqldb
.,但我已经手动编写了所有脚本来创建表。幸运的是,我只需要创建几张表。在此步骤中,我的主要问题是将用于创建表的 Oracle 脚本“翻译”成该hsqldb
语言。
例如,使用以下 sql 命令在 Oracle 中创建的表:
需要“翻译”为hsqldb
:
在我当前的项目中,有太多表无法手动执行...
所以我的问题:
- 你可以给我什么建议来实现这一目标?
- 是否提供
h2
或hsqldb
提供一些工具来从 Oracle 连接生成脚本?
技术信息
Java 1.6、Spring 2.5、Oracle 10.g、Maven 2
编辑
关于我的单元测试的一些信息:
在我使用的应用程序中hsqldb
,我进行了以下测试: - 一些与 DB 无关的“基本”单元测试。- 对于 DAO 测试,我曾经hsqldb
执行数据库操作,例如 CRUD。- 然后,在服务层,我曾经Mockito
模拟我的 DAO 对象,以便专注于服务测试而不是整个应用程序(即服务 + dao + DB)。
在我当前的应用程序中,我们遇到了最糟糕的情况:DAO 层测试需要运行 Oracle 连接。服务层不使用(还)任何模拟对象来模拟 DAO。因此服务测试也需要 Oracle 连接。
我知道模拟和内存数据库是两个不同的点,我会尽快解决它们。但是,我的第一步是尝试通过内存数据库删除 Oracle 连接,然后我将利用我的Mockito
知识来增强测试。
请注意,我还想将单元测试与集成测试分开。后者需要访问 Oracle 数据库,才能执行“真正的”测试,但我主要担心(这就是这个问题的目的)是我今天几乎所有的单元测试都不是孤立运行的。
c++ - 有人对 FastDB(C++ 内存数据库)有任何经验吗?
FastDB是一个与 C++ 紧密集成的开源内存数据库(它支持一种类似 SQL 的查询语言,其中表是类,行是对象)。与大多数 IMDB 一样,它适用于以读取访问模式为主的应用程序。算法和数据结构针对完全在主存储器 (RAM) 中读写数据的系统进行了优化。它应该非常快,即使与其他内存数据库相比也是如此,但我在网上找不到任何基准。
我正在考虑将 FastDB 用于时间序列数据,在一个项目中,1)亚毫秒级随机访问读取延迟,以及 2)每秒数百万行的连续读取吞吐量将非常好。
我找不到很多关于 FastDB 第一手经验的参考资料;这里有人用过吗?您能否指出 FastDB 的任何基准,尤其是那些考虑读取延迟和吞吐量的基准?
java - 与 Java 中的数据表作斗争
我是一名 .NET 开发人员,正在尝试使用 Java。我当前的项目有一个 UI 层、业务逻辑层和一个数据访问层。我目前正在研究 DAL。
我还没有连接到外部数据库;我曾希望让我的 DAL 类使用内存中的数据表,直到数据库到位。
在 .NET 中,创建内存数据表、从中选择、添加和删除非常容易。但是,在 Java 中,我一直找不到能做同样事情的东西。
我正在考虑用强类型对象的集合替换“dataTables”;但这需要在 DAL 内部添加对业务层的引用(我认为这是不行的)。
有人可以帮助困惑的开发人员吗?如果整个方法有缺陷,你会怎么做?如果我错过了相当于 Java 中的 dataTable - 它是什么?
java - 使用内存数据库存储数百万个临时值的效率如何?
我的应用程序当前存储数百万个Double
元素以进行计算。这些值在用于在计算结束时运行的特定算法之前只是临时值。一旦这个计算完成,数百万个值就可以被丢弃。
完整的故事在这里,如果你需要更多的细节。
提出的解决方案之一是使用内存数据库。
因此,如果我采用此解决方案,我将使用此数据库将我的值存储在表中以替换我的当前值Map<String, List<Double>>
,例如:
(每次计算一张表,XXX
为计算ID)
所以在计算过程中,我会做以下事情:
- 当计算开始时,我创建了
CALCULATION_RESULTS_XXX
表。 - 每次我需要添加一个值时,我都会在这个表中插入一条记录。
- 在计算结束时,我将表格内容用于我的算法。
- 最后,我放下这张桌子。
如另一主题所述,目前,我的计算可能会在内存中存储数百 Mb 的数据,因为 30 * 1,000,000 的列表Double
大约需要 240Mb。
现在的问题:
- 如果我使用内存数据库,我的内存消耗会减少吗?
- 关于数据库使用(或表创建)、数据插入等,我必须注意哪些具体点?
- 我想我会选择H2 数据库。您认为这是满足我需求的最佳选择吗?
sql - 是否有支持复制/集群的内存 SQL 数据库?
免费和稳定是赢家。
我的计划很简单——只需将所有数据放在内存中并使用集群而不更改应用程序代码。然后,为了持久性,我可以将节点中的数据转储到常规磁盘访问数据库中。
唯一的问题是,由于我需要内存存储,因此不可能进行完整的数据复制。我只想复制数据库模式,并且内存数据库为我一致地管理所有连接。
先感谢您!
更新:我找到了一个可能满足我要求的开源产品,它是VoltDB
.net - 您会向打算编写自己的数据库的人推荐什么读物?
由于我之前的问题没有答案。我真的在考虑实现一个自定义数据库来满足我的要求。
是的,我知道,听起来很疯狂。
但是您会推荐阅读哪些书籍、文章等?
如果它确实重要,我的数据库的要求如下
- 面向图 - 针对存储图和遍历进行了优化(例如 HyperGraphDB、Neo4j)
- 在内存中运行,但具有持久存储(例如 Redis)
- 分布式(例如 membase)
- 有 .NET 适配器(TCP/IP,不是 HTTP REST)
我不寻找技术细节,只是想找到一些关于通常如何做以及我有什么选择的理论信息来源。
eclipselink - 如何在 jpa2 的内存中使用 derby?
不管下面的 persistence.xml 配置如何,数据库都保存在磁盘上。
.net-4.0 - 实体框架 4 的内存数据库
有谁知道与 .NET 4/EF 4 配合得很好的内存数据库?具体来说,我正在考虑单元测试,这样每个设置都可以轻松创建数据库,并使用默认值填充它,并且每次拆卸都可以快速销毁它。
我听说 SQLite还不支持 .NET 4,而其他人在使用它作为 SQLServer 的替代品时遇到了麻烦(这是应用程序将在发布模式下运行的内容)。
过去,我使用 DevExpress XPO ORM,它有一个内置的内存数据库,非常适合单元测试。
c++ - 寻求简单内存数据库 *server* 的建议(无需持久性)
应该支持多个连接,最好通过 ODBC。客户端将在同一台机器上作为单独的进程运行。不需要持久性,因为客户端将在其他地方处理持久性。如果重要的话,客户端是用 C++ 编写的。
数据很简单,就是一组不相关的双向地图。直接通过值或范围 ( between X and Y
) 访问,没有更新。我们这里其实不需要SQL,所以也可以考虑非SQL的方案。
客户端应用程序是多进程的,可以在多台机器上运行。每台机器都应该有一个这样的数据库的本地副本,由其本地客户端针对中央存储进行更新。
多个编辑:
- 平台是Linux
- 出于安全原因,RAM 磁盘不是一个选项 - 我们不希望任何有权访问机器的人都能够查看数据
- 数据只能以加密形式保存,因此解决方案要么根本不保存数据,要么允许用户定义的过滤器/插件进行保存。
performance - 允许索引的远程键值存储?
在我们的项目中,我们已经为对象嵌入了内存中的键值存储,它非常有用,因为它允许我们为它创建索引并根据它查询存储。因此,如果我们有一个“Student”的集合,并且在 student.group 和 student.sex 上有一个复合索引,那么我们可以找到“ABC”组中的所有男学生。删除等也是如此。
现在我们必须采用我们的服务在云中工作,这样会有多个服务器,处理用户请求,它们有一个共享的状态,存储在这个键值索引存储中。我们尝试采用 memcashed 来满足我们的需求,它几乎是理想的——它是快速、简单且经过验证的解决方案,但它没有索引,因此我们不能习惯于搜索我们的临时数据。
有没有其他方法可以拥有远程缓存,就像 memcashed 一样,但有索引?
谢谢你。