有没有办法浏览H2或HSQLDB内存数据库的内容以供查看?例如,在与Hibernate的调试会话期间,为了检查执行刷新的时间; 或者确保实例化DB的脚本给出了预期的结果.
是否存在可以嵌入代码的插件或库,以便允许这样做?
如果你有一个特定于其中一个的答案,请提及你正在谈论的那个(H2或HSQLDB).
我是python和django的新手,在关注Django Book时,我了解了命令'python manage.py syncdb',它为我生成了数据库表.在开发环境中,我在内存数据库中使用sqlite,因此每次重新启动服务器时都会自动删除它.那么我如何编写这个'syncdb'命令的脚本?(这应该在'settings.py'文件中完成吗?)
澄清
OP正在使用内存数据库,需要在使用针对该数据库定义的Django模型的任何进程开始时对其进行初始化.确保数据库初始化的最佳方法是什么(每个进程启动一次).这可以通过manage.py runserver或通过Web服务器进程(例如使用WSGI或mod_python)运行测试或运行服务器.
我发现想要在我的功能程序中建模关系数据是很常见的.例如,在开发网站时,我可能希望使用以下数据结构来存储有关我的用户的信息:
data User = User
{ name :: String
, birthDate :: Date
}
Run Code Online (Sandbox Code Playgroud)
接下来,我想存储有关用户在我的网站上发布的消息的数据:
data Message = Message
{ user :: User
, timestamp :: Date
, content :: String
}
Run Code Online (Sandbox Code Playgroud)
此数据结构存在多个问题:
User是脆弱的 - 您可能忘记更新User数据结构中的所有事件.这些问题是可管理的,而我们的数据可以表示为树.例如,您可以像这样重构:
data User = User
{ name :: String
, birthDate :: Date
, messages :: [(String, Date)] -- you get the idea
}
Run Code Online (Sandbox Code Playgroud)
但是,可以将数据整形为DAG(想象任何多对多关系),甚至可以作为一般图形(好的,也许不是).在这种情况下,我倾向于通过在Maps中存储我的数据来模拟关系数据库:
newtype Id a = Id Integer
type Table a = …Run Code Online (Sandbox Code Playgroud) 我们如何使用Angular-in-memory-web-api创建多个集合?单个集合不是问题.但是我无法为多个集合实现它.
例如,我想在内存db - Country和Cities中创建两个集合.任何想法,怎么做?
引用Spark DataFrames,Datasets和SQL手册:
Spark中还没有包含少数Hive优化.由于Spark SQL的内存计算模型,其中一些(如索引)不太重要.其他版本用于将来的Spark SQL版本.
作为Spark的新手,我有点困惑,原因有两个:
Spark SQL旨在处理大数据,至少在我的用例中,数据大小远远超过可用内存的大小.假设这并不罕见,"Spark SQL的内存计算模型"是什么意思?Spark SQL是否仅适用于数据适合内存的情况?
即使假设数据适合内存,对非常大的数据集进行全扫描也需要很长时间.我在内存数据库中读取了这个反对索引的论点,但我并不相信.那里的例子讨论了一个10,000,000记录表的扫描,但这不是真正的大数据.扫描具有数十亿条记录的表可能导致"SELECT x WHERE y = z"类型的简单查询永远不会立即返回.
我理解索引有诸如较慢的INSERT/UPDATE,空间要求等缺点.但在我的用例中,我首先处理并将大批数据加载到Spark SQL中,然后将这些数据作为一个整体进行探索,而无需进一步修改.Spark SQL对于初始分布式处理和数据加载很有用,但缺乏索引使得交互式探索比我预期的更慢,更麻烦.
我想知道为什么Spark SQL团队认为索引不重要到它的路线图之外的程度.是否有不同的使用模式可以提供索引的好处,而无需独立实现等效的东西?
sql bigdata in-memory-database apache-spark apache-spark-sql
我有一个应用程序,其中许多"单元"测试在执行期间使用与Oracle数据库的真实连接.
可以想象,这些测试需要花费太多时间来执行,因为它们需要初始化一些Spring上下文,并与Oracle实例进行通信.除此之外,我们还必须管理复杂的机制,例如事务,以避免在测试执行后修改数据库(即使我们使用Spring中的有用类AbstractAnnotationAwareTransactionalTests).
所以我的想法是逐步用内存数据库替换这个Oracle测试实例.我会用hsqldb或者更好h2.
我的问题是要知道这样做的最佳方法是什么.我主要关心的是构建内存数据库结构和插入参考数据.
当然,我可以使用像SQL Developeror 这样的工具从Oracle中提取数据库结构TOAD,然后修改这些脚本以使它们适应hsqldb或h2使用它们.但我不认为这是更好的方法.
事实上,我已经在另一个项目上使用了hsqldb,但是我已经手动编写了所有脚本来创建表.幸运的是,我只创建了几张桌子.我在此步骤中的主要问题是将用于创建表的Oracle脚本"转换"为该hsqldb语言.
例如,使用以下sql命令在Oracle中创建的表:
CREATE TABLE FOOBAR (
SOME_ID NUMBER,
SOME_DATE DATE, -- Add primary key constraint
SOME_STATUS NUMBER,
SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);
Run Code Online (Sandbox Code Playgroud)
需要"翻译"为hsqldb:
CREATE TABLE FOOBAR (
SOME_ID NUMERIC,
SOME_DATE TIMESTAMP PRIMARY KEY,
SOME_STATUS NUMERIC,
SOME_FLAG INTEGER DEFAULT 0 NOT NULL);
Run Code Online (Sandbox Code Playgroud)
在我当前的项目中,有太多表要手动执行...
所以我的问题:
h2还是hsqldb提供了一些工具来生成一个Oracle连接的脚本?技术信息 …
可能重复:
运行集成测试时嵌入式MongoDB
我想使用In-Memory模式进行单元测试,是否存在像RavenDB这样的In-Memory模式?
我正在尝试使用InMemory EF7数据库进行我的xunit存储库测试.
但我的问题是,当我尝试Dispose创建的上下文时,内存db仍然存在.这意味着一个测试涉及其他.
我已阅读这篇文章单元测试实体框架7与内存中的数据存储和我试图安装在我的TestClass的构造背景.但这种方法不起作用.当我单独运行测试时一切正常,但我的第一个测试方法是在DB中添加一些东西,第二个测试方法从之前的测试方法开始使用脏DB.我尝试添加IDispose到测试类,但方法DatabaseContext和DB在内存中持久存在.我错了什么我错了什么?
我的代码看起来像:
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
namespace Fabric.Tests.Repositories
{
/// <summary>
/// Test for TaskRepository
/// </summary>
public class TaskRepositoryTests:IDisposable
{
private readonly DatabaseContext contextMemory;
/// <summary>
/// Constructor
/// </summary>
public TaskRepositoryTests()
{
var optionsBuilder = new DbContextOptionsBuilder<DatabaseContext>();
optionsBuilder.UseInMemoryDatabase();
contextMemory = new DatabaseContext(optionsBuilder.Options);
}
/// <summary>
/// Dispose DB
/// </summary>
public void Dispose()
{
//this has no effect
if (contextMemory != null)
{ …Run Code Online (Sandbox Code Playgroud) 我只是认为现在通常在数据库服务器上有足够的RAM来缓存你的完整数据库为什么内存数据库中的专家 (例如TimesTen,另见维基百科页面)几年前风靡一时不被使用更多?
似乎随着时间的推移,没有更少的基于磁盘的数据库被使用,例如,现在大多数应用程序都建立在传统的理性数据库上.我原本期望相反,因为RAM已经接近很多服务器的免费.
我问这个问题,因为我刚刚阅读了堆栈溢出架构,页面上写道
这很重要,因为Stack Overflow的数据库几乎完全在RAM中,并且连接的成本仍然太高.
但是,如果使用"指针"和"集合"而不是普通的btree,我认为这不会是一个问题.Btree非常聪明地限制磁盘访问速度,例如它们交换CPU使用以减少磁盘使用.但是我们现在有匹配ram.
但我们仍然需要数据库,就像做自己的一样
很难.
@ S.Lott,鉴于我们都花了这么长时间选择索引,避免加入和调查数据库性能问题.肯定有更好的办法.几年前,我们被告知"内存数据库"是更好的方法.所以在我开始使用其他之前,我想知道为什么其他人不再使用它们.
(我不太可能自己使用TimesTen,因为价格很高(41,500.00美元/处理器)而且我不喜欢和Oracle销售人员交谈 - 我宁愿花时间编写代码.)
也可以看看:
更新:
我问这个问题一个长的时间以前,这几天的Microsoft SQL Server具有" 在内存OLTP ",也就是集成到SQL Server引擎内存优化的数据库引擎.它并不便宜,但对某些工作负载来说似乎非常快.
我想做的是以下几点:
using System.Data.SQLite;
using System.IO;
//My SQLite connection
SQLiteConnection myCon;
public void ReadAndOpenDB(string filename)
{
FileStream fstrm = new FileStream(filename, FileMode.Open);
byte[] buf = new byte[fstrm.Length];
fstrm.Read(buf, 0, (int)fstrm.Length);
MemoryStream mstrm = new MemoryStream(buf);
//Do some things with the memory stream
myCon = new SQLiteConnection(/*attach to my memory stream for reading*/);
myCon.Open();
//Do necessary DB operations
}
Run Code Online (Sandbox Code Playgroud)
我不打算写入内存数据库,但我需要能够在连接到程序之前在程序的内存中对文件做一些事情.
c# ×2
h2 ×2
hsqldb ×2
.net ×1
.net-core ×1
angular ×1
apache-spark ×1
api ×1
bigdata ×1
connection ×1
database ×1
django ×1
haskell ×1
java ×1
mongodb ×1
python ×1
ravendb ×1
sql ×1
sqlite ×1
transactions ×1
type-safety ×1
unit-testing ×1