2

私の質問は次のとおりです。java.util.collections(ArrayList / HashMap / 3rd party LIBなど)を使用してデータベースの種類の機能(インメモリデータベースが提供する)を実装する方法はありますか。少し説明します。

25個の属性が異なるモデルクラスAccountがあり、たとえば5000個のアカウントのデータをArrayListに格納できます。同じように、テーブルt_Accountを作成することで、インメモリデータベースにデータを保持できます。次に、以下のような基本的な操作を実装したいと思います。

  1. 各属性に基づいて昇順/降順で並べ替えます。(例:SQLのOrder By操作)

  2. 各属性の異なるフィルター基準に基づいて特定のモデルアカウントをフィルターで除外しますか?(SQLのテーブルにWHERE / AND条件を適用する)

  3. 特定の属性に基づいて特定のアカウントを検索しますか?(SQLのテーブルにLIKE操作を適用する)

要するに、私の主な目的は、Javaを使用してインメモリデータベース関連の機能を実現することです。これは、インメモリデータベースの操作と同じくらい優れているはずです。

貴重な時間と提案を事前に感謝します...

4

2 に答える 2

1

もちろん、そうでない限り、データベースがメモリ内で行うことの一部を行うことができます

  • 複雑なクエリを実装したい

  • 大量のデータセットのパフォーマンスを探す: 複雑なインデックス (メンテナンスを含む) は簡単なことではありません

しかし、5000 レコードは非常に小さいセットであるため、おそらくカスタム関数とインデックスを使用してメモリ内で問題なく管理できます。並べ替え、フィルタリング、検索は、任意の言語の小さなセットに簡単に実装できます。

Collections.sort()を見てください。比較関数が高速である限り、小さなコレクションのソートは高速です。

一方、sqlite のような小さなデータベースを使用するのも簡単です。よくわからない場合は、Java ソリューションから始めて、プロファイリングでメモリ内データベースを必要に応じて十分に効率的に処理できないことがわかった場合に、後で外部ツールを統合できます。RAM に簡単に収まり、データを永続化する必要がない場合は、メモリ内で実行してみてください。データベースを使用する最初の理由は永続性です。逆に、プログラムの開始と停止 (またはクラッシュ) の間で記録を保持する必要がある場合は、データベースを使用します。

于 2012-06-15T06:27:34.950 に答える
1

HSQLDBH2の純粋な Java SQL DB はどちらも、完全にメモリ内で動作できます (ネイティブではないにもかかわらず、非常に高速です)。

接続文字列、HSQLDB: jdbc:hsqldb:mem:、H2: jdbc:h2:mem:。それらの後に識別子を追加して、同じ VM で複数の接続をサポートするメモリ内データベースを作成できます。

ネイティブの組み込み SQL DB であるSQLiteも完全にインメモリで動作し、Xerial SQLiteドライバーは接続文字列を使用しますjdbc:sqlite::memory:。SQLite では と の後に識別子を使用できないことに注意してください:memory:。同じ VM で への 2 つの接続を開くと、:memory2 つの異なるメモリ内データベースが取得されます。

異なるスレッドから同じ接続オブジェクトを使用する必要があり、上記の 3 つのデータベースはすべてスレッドセーフであるため、同じ接続オブジェクトを再利用できるため、名前付きインメモリ接続を使用する必要性は実際にはないと思います。

Firebird組み込みデータベースは、インメモリ データベースを提供しません。

于 2016-07-16T09:08:46.723 に答える