問題タブ [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.
database - インメモリ データベース
私は SqlServer を使用して WPF アプリケーションを駆動しています。現在 NHibernate を使用しており、すべてのデータを事前に読み取っているため、パフォーマンス上の理由からキャッシュされています。これは単一のクライアント アプリで機能しますが、同じマシン上の複数のアプリ間で情報を共有できるように使用できるメモリ内データベースがあるかどうか疑問に思っていました。理想的には、これは私の NHibernate スタックの下にあるので、コードを変更する必要はありません。事実上、DB をサーバー上の従来の形式からクライアント上のメモリ内 DB に移動しようとしています。
注意選択機能のみが必要です。
java - 永続化できるメモリ内Javaデータベース(単一の巨大なメモリブロブとして)
Java用のインメモリリレーショナル(SQL)データベース(HSQLDBのようなもの)を探しています。その状態全体をシリアル化できます。
または、DBは初期化時に指定したbyte[]のみを使用する可能性があります。
データベースはそれほど大きくなく、数十MBもありませんが、ファイルを書き込めないため、VMをシャットダウンする前に(そして定期的にバックアップのために)マシンからすべてをストリーミングする必要があります。
DBの代わりに、配列やマップなどのプレーンな(そして簡単にシリアル化できる)Javaデータ構造を使用することもできますが、SQLを使用できるようにしたいと考えています。
rdbms - メイン メモリ DB とオブジェクト DB
現在、データベース ベンダーを選択しようとしています。
仲間のデータベース開発者からの個人的な意見を求めているだけです。
私の質問は、特に次のような人々を対象としています。
1) 以前にディスク (ハイブリッド) へのレプリケーションをサポートするメイン メモリ DB (MMDB) を使用したことがある (つまり、 ExtremeDB )
また
2) Versant Object Databaseおよび/またはObjectivity Databaseおよび/またはProgress ObjectStoreを使用したことがある
質問は本当に: あなたの経験に基づいて、私のアプリケーションに適したデータベース ベンダーをお勧めできるかどうかです。
私のアプリケーションは商用のリアルタイム (ハイパフォーマンス) オブジェクト指向 C++ GIS アプリであり、多くの緯度/経度検索を行う必要があります (つまり、特定のエリアで、そのエリア内の一致するすべてのターゲットを検索します)。 ..R ツリー インデックス)。
データベースに保存したいデータの型はすべてオブジェクトとしてモデル化されており、それらは std::list と std::vector を使用しているため、当然オブジェクト データベースは理にかなっているように思えます。従来の RDBMS はおそらく私が実際に探しているものではないことを確信するのに十分な記事を読みました。
- パフォーマンス (リスト/ベクターなどの動的長データの結合または複数のテーブル)
- プログラミングの容易さ (インピーダンスのミスマッチ)
ただ、性能面では、
入力データは、約 40 MB/秒でシステムに供給されています。
したがって、システムは 1 秒あたり約 350 回の挿入の速度でデータベースへの挿入も行います (各オブジェクトは 64KB から 128KB まで変化します)。
- データベースは、複数のスレッドを介して一貫して検索および更新されます。
私の理解では、ここにリストしたすべてのオブジェクト DB はデータベース オブジェクトを格納するためにキャッシュを使用します。ExtremeDB は、特にメモリ用に設計されているため、キャッシュ ロジックなどのオーバーヘッドを回避できると主張しています。
だから..私は少し混乱しています。オブジェクト DB はリアルタイム システムで使用できますか? MMDB と同じくらい「高速」ですか?
.net - AppDomain の境界を越えて利用可能なメモリ内データベース
同じインメモリ データベース インスタンスを複数の AppDomains で使用できる、インメモリ データベースの実装があるのではないかと思います。
動機。多くの人と同じように、クライアント サーバー アプリケーションの統合テストがあります。クライアント、サーバー、およびデータベースがすべて異なるマシンに配置されている実際のシナリオから、クライアントとサーバーの両方が同じプロセス内の単純な 2 つの AppDomain である最も軽量なものまで、いくつかのテスト モードがあります。データベースは同じマシン上の sqlite ファイルです。
当然のことながら、軽量のシナリオが最も高速であり、開発者は日常的にそれを使用しますが、重いシナリオはビルドごとに CI サーバーで実行されます。
私の目標は、インメモリ データベースを使用して軽量シナリオをさらに高速化することです。
問題。OK、sqlite にはメモリ内データベース オプションがありますが、そのようなデータベースは次のようになります。
- への接続が閉じられた後に破棄されます。
- 2 つの接続を開くことはできません。新しい接続は別のデータベース インスタンスを開きます。
残念ながら、2 つ必要です。1 つはクライアント側の AppDomain で実行されるテスト ステージング コード用で、もう 1 つはサーバー側の DAL 用です。
sqlite インメモリ データベースの仕組みの背後にある理論的根拠を理解しています。また、2 つの AppDomain 間でメモリ内データベースを共有することの難しさも認識しています。メモリ マップされたファイルに戻らずに、2 つの AppDomains 間でメモリ バッファを共有するにはどうすればよいですか (また、ファイル システム API を扱いたくありません)。
私が見る唯一の効率的な解決策は、2 つの AppDomain でアンマネージ メモリ バッファーを共有することです。このバッファーへのハンドルは、ある AppDomain から別の AppDomain に渡されます。しかし、このセットアップをサポートするメモリ内データベースの実装はありますか?
(非効率的な解決策は、ある AppDomain から別の AppDomain にデータベース全体を渡し、再度戻すことです)。
私の分析は完全に間違っている可能性があり、見逃している簡単な解決策があるかもしれません。とにかく、誰かが同じ問題に遭遇したかどうか、そしてどのように解決したかを知りたい.
PS
メモリにマップされたファイルなど、あらゆる種類のファイル API は避けたいと思います。
database - 計算列をサポートするインメモリ データベースはありますか?
計算列を持つテーブルを持つ SQL 2005/2008 データベースがあります。計算列を NHibernate のディスクリミネーターとして使用しているため、データベースにあると非常に便利であることが証明されています。
より高速な統合テストの利点を得るために、SQLite や SQL CE などのインメモリ データベースに対して統合テストを実行できるようにしたいと考えています。しかし、どちらも計算列をサポートしているとは思いません。
私の問題に対する他の解決策はありますか?私はデータベースに完全にアクセスでき、より良い解決策があれば変更できます。計算列の代わりにビューを使用することを提案するこの投稿を見たことがありますが、これは最良の代替手段ですか?
database - インメモリ データベースの使用をいつ検討する必要がありますか? また、注意すべき問題は何ですか?
データベース サーバーに完全なデータベースをキャッシュするのに十分な RAM を搭載するのが一般的になっていると思いました。数年前に大流行したメモリ データベースのスペシャリスト ( TimesTenなど、ウィキペディアのページも参照) が使用されていないのはなぜですか。もっと?
時が経つにつれて、ディスクベースのデータベースの使用が減少しているように見えます。たとえば、ほとんどのアプリケーションは現在、従来の合理的なデータベース上に構築されています。多くのサーバーで RAM が空きに近づいているため、逆の結果になると予想していました。
stack-overflow-architecture を読んだところ、ページに次のように書かれているので、これを尋ねています
Stack Overflow のデータベースはほぼ完全に RAM 内にあり、結合の正確なコストは依然として高すぎるため、これは重要です。
しかし、通常の btree の代わりに「ポインタ」と「コレクション」が使用されていれば、これは問題にならないと思います。Btree は、ディスク アクセス速度の制限を回避するのに非常に巧妙です。たとえば、ディスク使用量を減らすために CPU 使用率を交換します。しかし、今ではマッチラムがあります。
ただし、独自に行うように、データベースはまだ必要です
- ロック
- デッドロック検出
- トランザクション ログ
- 回復
- 等
非常に難しいです。
@S.Lott、インデックスの選択、結合の回避、データベースのパフォーマンスの問題の調査に非常に長い時間を費やしていることを考えると。もっと良い方法があるはずです。数年前、「メモリ内データベース」の方が優れていると言われました。だから、私がそのようなものを使う前に、なぜ他の人がそれらをもっと使わないのか知りたい.
(TimesTen は価格が高く ( $41,500.00/Processor )、Oracle の営業担当者と話すのは好きではないので、自分で TimesTen を使用することはほとんどありません。コードを書くことに時間を費やしています。)
以下も参照してください。
アップデート:
私はずっと前にこの質問をしました。最近の Microsoft SQL Serverには、SQL Server エンジンに統合されたメモリ最適化データベース エンジンである「インメモリ OLTP 」があります。安くはありませんが、一部のワークロードでは非常に高速なようです。
.net - TimesTenインメモリー・データベースの代替
「さまざまなインメモリ RDBMS の詳細な比較を公開した人はいますか?」それは私の質問に関連しています。
TimesTen (も参照) は、Oracle のインメモリ データベースです。
それを含め、多くのことが行われています。
- 高速で一貫した応答時間
- 高いトランザクション スループット
- 標準 SQL、アプリケーションの書き換えなし
- 永続的で回復可能
- 高可用性とデータ損失なし
ただし、ほとんどの人には手の届かない価格です ( 41,500.00 ドル/プロセッサー)。
では、どのような代替案があり、どのような長所と短所がありますか。
(答えが変わる場合は.NETを使用しています)
sqlite - SubSonic 3 リポジトリ - SQLite インメモリ
SubSonic 3 のソースの修正に時間を費やす前に、何か単純なものが欠けているかどうかを確認するように依頼することにしました。
SubSonic 3 リポジトリを SQLite インメモリ データベースでの移行に使用することはできますか? 接続が閉じられたときにインメモリ SQLite データベースが消えないように、DbDataProvider に強制的に接続を開いたままにする方法が見つかりませんでした。
私が試していた接続文字列を使用した単体テストは...
IDataProvider で「共有接続」を設定しようとしましたが、接続はまだ閉じているようです。
そうでない場合は、SubSonic のソースを更新し、変更を送信します。
ありがとう!