問題タブ [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
。
私の質問は、それを行うための最良のアプローチは何かを知ることです。私の主な関心事は、インメモリデータベース構造の構築と参照データの挿入に関連しています。
もちろん、SQL Developer
またはなどのツールを使用してOracleからデータベース構造を抽出し、TOAD
これらのスクリプトを変更してhsqldb
またはのh2
言語に適合させることもできます。しかし、それがより良いアプローチだとは思いません。
実際、私はすでにを使用して別のプロジェクトhsqldb
でそれを行いましたが、テーブルを作成するためにすべてのスクリプトを手動で作成しました。幸い、作成するテーブルはほとんどありませんでした。このステップでの私の主な問題は、テーブルの作成に使用されるOracleスクリプトを言語に「変換」することでしたhsqldb
。
たとえば、次のsqlコマンドを使用してOracleで作成されたテーブル:
次の目的で「翻訳」する必要がありますhsqldb
。
私の現在のプロジェクトでは、手動でそれを行うにはテーブルが多すぎます...
だから私の質問:
- それを達成するためにあなたが私に与えることができるアドバイスは何ですか?
- Oracle接続からスクリプトを生成するためのツールを提供しています
h2
か?hsqldb
技術的な案内
Java 1.6、Spring 2.5、Oracle 10.g、Maven 2
編集
私のユニットテストに関するいくつかの情報:
私が使用したアプリケーションでhsqldb
は、次のテストを行いました。-DBとは関係のないいくつかの「基本的な」単体テスト。-DAOテストでは、hsqldb
CRUDなどのデータベース操作を実行していました。-次に、サービスレイヤーで、Mockito
アプリケーション全体(つまり、サービス+ dao + DB)ではなく、サービステストに焦点を合わせるために、DAOオブジェクトをモックしていました。
現在のアプリケーションでは、最悪のシナリオがあります。DAOレイヤーのテストでは、Oracle接続を実行する必要があります。サービスレイヤーは、DAOをシミュレートするために(まだ)モックオブジェクトを使用しません。したがって、サービステストにはOracle接続も必要です。
モックとインメモリデータベースは2つの別個のポイントであることを認識しており、できるだけ早くそれらに対処します。ただし、最初のステップは、インメモリデータベースによってOracle接続を削除することです。次に、知識を使用しMockito
てテストを強化します。
また、単体テストを統合テストから分離したいことに注意してください。後者は、「実際の」テストを実行するためにOracleデータベースにアクセスする必要がありますが、私の主な関心事(そしてこれがこの質問の目的です)は、今日、ほとんどすべての単体テストが単独で実行されていないことです。
c++ - FastDB (C++ インメモリ データベース) の経験がある人はいますか?
FastDBは、C++ と緊密に統合されたオープンソースのインメモリ データベースです (テーブルがクラスで行がオブジェクトである SQL に似たクエリ言語をサポートしています)。ほとんどの IMDB と同様に、読み取りアクセス パターンが支配的なアプリケーション向けです。アルゴリズムとデータ構造は、データ全体をメイン メモリ (RAM) で読み書きするシステム向けに最適化されています。他のインメモリデータベースと比較しても非常に高速であるはずですが、オンラインでベンチマークを見つけることができません.
時系列データに FastDB を使用することを検討しています。プロジェクトでは、1) ミリ秒未満のランダム アクセス読み取りレイテンシ、および 2) 1 秒あたり数百万行のシーケンシャル読み取りスループットが非常に優れています。
FastDB を実際に使用した経験についての参考文献はあまり見つかりません。ここで使った人いますか?FastDB のベンチマーク、特に読み取りレイテンシとスループットを考慮したものを教えてください。
java - Java での DataTable との闘い
私は Java を試している .NET 開発者です。私の現在のプロジェクトには、UI レイヤー、ビジネス ロジック レイヤー、およびデータ アクセス レイヤーがあります。私は現在DALに取り組んでいます。
まだ外部データベースに接続していません。DB が配置されるまで、DAL クラスでインメモリ dataTables を利用することを望んでいました。
.NET では、インメモリ dataTable の作成、選択、追加、削除が非常に簡単です。しかし、Java では、同じことを行うものを見つけることができませんでした。
「dataTables」を厳密に型指定されたオブジェクトのコレクションに置き換えることを検討していました。ただし、それには、DAL 内のビジネス レイヤーへの参照を追加する必要があります (これはダメだと思いました)。
誰かが混乱している開発者を助けることができますか? このアプローチ全体に欠陥があるとしたら、どうしますか? Java の dataTable に相当するものを見逃した場合、それは何ですか?
java - インメモリ データベースを使用して何百万もの一時的な値を格納するのは、どれほど効率的でしょうか?
私のアプリケーションは現在Double
、計算のために何百万もの要素を保存しています。これらの値は、計算の最後に実行される特定のアルゴリズムに使用される前の一時的な値にすぎません。この計算が完了すると、何百万もの値を破棄できます。
詳細が必要な場合は、完全なストーリーがここにあります。
提案されたソリューションの 1 つは、インメモリ データベースを使用することです。
したがって、このソリューションを使用する場合、このデータベースを使用して値をテーブルに保存し、次のMap<String, List<Double>>
ように current を置き換えます。
(計算ごとに 1 つのテーブルXXX
、計算 ID です)
したがって、計算中に次のことを行います。
- 計算が開始されたら、
CALCULATION_RESULTS_XXX
テーブルを作成します。 - 値を追加する必要があるたびに、このテーブルにレコードを挿入します。
- 計算の最後に、テーブルの内容をアルゴリズムに使用します。
- 最後に、このテーブルを削除します。
他の件名Double
で説明したように、現在、30 * 1,000,000 のリストには約 240Mb が必要になるため、私の計算では数百 Mb のデータがメモリに格納される可能性があります。
今の質問:
- インメモリ データベースを使用すると、メモリの消費量は減りますか?
- データベースの使用(またはテーブルの作成)、データの挿入などに関して注意する必要がある特定のポイントは何ですか?
- H2データベースを選択すると思います。それが私のニーズに最適な選択だと思いますか?
sql - レプリケーション/クラスタリングをサポートするインメモリSQLデータベースはありますか?
無料で安定したものが勝者です。
私の計画は非常に簡単です。すべてのデータをメモリに入れて、アプリケーションコードを変更せずにクラスターを使用するだけです。次に、永続性を確保するために、通常のディスクアクセスデータベースのノードからデータをダンプするだけで済みます。
唯一のことは、メモリ内ストレージを要求するため、完全なデータ複製の可能性がないということです。DBスキーマのみをコピーしたいのですが、そのインメモリDBがすべての結合を一貫して管理します。
前もって感謝します!
更新:私の要件を満たす可能性が高いオープンソース製品を見つけました。それはVoltDBです。
.net - 自分のDBを作成しようとしている人に何を読むことをお勧めしますか?
私の前の質問に対する答えがないので。要件を満たすカスタムDBを実装することを本当に考えています。
はい、私は知っています、クレイジーに聞こえます。
しかし、どの本や記事などを読むことをお勧めしますか?
それが重要な場合、私のDBの要件は次のとおりです
- グラフ指向-グラフとトラバーサルを保存するために最適化されています(例:HyperGraphDB、Neo4j)
- メモリ内で実行されていますが、永続的なストレージがあります(例:Redis)
- 分散型(例:membase)
- .NETアダプターがありました(HTTPRESTではなくTCP/ IP)
私は技術的な詳細を探すのではなく、物事が通常どのように行われ、どのような選択肢があるかについての理論的情報のソースを見つけたいだけです。
eclipselink - jpa2でメモリ内でダービーを使用するにはどうすればよいですか?
次の persistence.xml 構成に関係なく、データベースはディスク上に永続化されます。
.net-4.0 - Entity Framework 4 のインメモリ DB
.NET 4/EF 4 でうまく動作する優れたメモリ内 DB を知っている人はいますか? 具体的には、各セットアップで DB を簡単に作成してデフォルト値を設定し、分解するたびに DB をすばやく破棄できるように、単体テストを考えています。
SQLite はまだ.NET 4 をサポートしていないと聞いたことがあります。また、SQLServer (アプリケーションがリリース モードで実行されるもの) の代わりとして使用するのに問題があるという人もいます。
以前、私は DevExpress XPO ORM を使用していましたが、これには組み込みのメモリ内データベースがあり、単体テストに非常に適していました。
c++ - 単純なインメモリ DB *server* の推奨事項を求めています (永続化は必要ありません)
できれば ODBC 経由で、複数の接続をサポートする必要があります。クライアントは、同じマシン上で個別のプロセスとして実行されます。クライアントが他の場所で持続性を処理するため、持続性は必要ありません。重要な場合、クライアントは C++ で記述されています。
データは非常に単純で、関連のない双方向マップのセットです。アクセスは、値または範囲 ( between X and Y
) によって直接行われ、更新はありません。ここでは実際には SQL は必要ないため、SQL 以外のソリューションも検討できます。
クライアント アプリケーションはマルチプロセスであり、複数のマシンで実行できます。各マシンには、ローカル クライアントによって中央ストアに対して更新される、そのような DB のローカル コピーが必要です。
複数の編集:
- プラットフォームは Linux です
- セキュリティ上の理由から、RAM ディスクはオプションではありません。マシンにアクセスできる人がデータを表示できるようにしたくありません。
- データは暗号化された形式でのみ永続化する必要があるため、ソリューションではデータをまったく永続化しないか、永続化のためにユーザー定義のフィルター/プラグインを許可する必要があります。
performance - インデックスを許可するリモートKey-Valueストレージ?
私たちのプロジェクトでは、オブジェクト用の組み込みのメモリ内Key-Valueストレージがすでにあり、インデックスを作成し、それに基づいてストレージをクエリできるため、非常に便利です。したがって、「Student」のコレクションと、student.groupおよびstudent.sexの複合インデックスがある場合、グループ「ABC」のすべての男子学生を見つけることができます。削除なども同様です。
次に、クラウドでの作業にサービスを採用する必要があります。これにより、複数のサーバーが存在し、ユーザーリクエストを処理し、それらのサーバーが共有状態になり、このKey-Valueインデックス付きストレージに保存されます。ニーズに合わせてmemcashedを採用しようとしましたが、ほぼ理想的です。高速でシンプルで実績のあるソリューションですが、インデックスがないため、一時データの検索には使用できません。
memcashedのように、インデックスを使用してリモートキャッシュを作成する他の方法はありますか?
ありがとうございました。