メモリ内データベース
-
05-07-2019 - |
質問
SqlServerを使用してWPFアプリケーションを駆動していますが、現在はNHibernateを使用してすべてのデータを事前読み取りしているため、パフォーマンス上の理由でキャッシュされます。これは単一のクライアントアプリで機能しますが、同じマシン上の複数のアプリ間で情報を共有できるように、使用できるメモリ内データベースがあるのではないかと考えていました。理想的には、これはNHibernateスタックの下にあるため、コードを変更する必要はありません。事実上、サーバー上の従来の形式からDBをクライアント上のメモリ内DBに移行することを検討しています。
注:選択機能のみが必要です。
解決
http://www.db4o.com/ はあなたの友達になれます!
他のヒント
すべての情報をメモリにロードする必要がある場合でも、私は驚くでしょう。私がこれを言っているのは、ちょうど一例として、(さまざまな理由で)多くのページに数千のレコードをロードするWebアプリを開発しているからです。これはPHP + MySQLです。たとえそうであっても、それはそれを実行し、ページを100ミリ秒未満でレンダリングできます。
このルートを下る前に、必要があることを確認してください。まず、データベースを可能な限り高性能にします。現在、これには適切なインデックスの作成やデータベースの調整などが含まれていますが、カートの前に馬を置いています。
何よりもまず、優れたリレーショナルデータモデル(パフォーマンスの高いクエリに適したもの)を用意する必要があります。これは科学と同じくらい芸術です。
また、NHibernateが好きかもしれませんが、 ORMは常に最適とは限りません選択。たとえば、手作業でコーディングしたSQLが非常に優れている場合など、いくつかのコーナーケースがあります。
適切なデータモデルがあり、インデックスとデータベースパラメーターを最適化し、NHibernateを適切に構成したと仮定すると、メモリにデータを保存することを検討する必要がありますパフォーマンスは依然として問題です。
これを理解するために、これを行う必要があるのは、1日あたり数百万のトランザクションを実行する必要があるシステム上でのみです。
メモリ内キャッシュを回避する理由の1つは、多くの複雑さを追加するためです。キャッシュの有効期限、基になるデータストアの独立した更新、同期または非同期の更新を使用するかどうか、クライアントにデータの一貫性のある(最新でない場合)ビューを提供する方法、対処方法などの問題に対処する必要がありますフェイルオーバーやレプリケーションなどがあります。複雑な費用がかかります。
上記のすべてを実行し、それでも必要な場合、必要なのはキャッシュまたはグリッドソリューションのように思えます。これは Javaグリッド/クラスターソリューションの概要ですが、それらの多く(Coherence、memcachedなど)は.Netにも適用されます。 .Netのもう1つの選択肢は、 Velocity です。
NHibernateのようなものは、データベースを外部から更新するものがなく、NHibernateが有効なプロセスが1つしかない限り(クラスター化ソリューションを除いて)一貫性があることを指摘し、強調する必要があります。 2つの異なるPC上の2つのデスクトップアプリが両方ともNHibernateで同じデータベースを更新している場合、永続化ユニットは他方の変更を認識しないため、キャッシュは機能しません。
Velocity は、Microsoftが設計したアウトオブプロセスオブジェクトキャッシュサーバーであり、ほとんど何でも実行できます。現時点ではCTP形式のみです。
memcachedのラッパーもあり、オブジェクトのキャッシュにも使用できると思います。
HANA、Express Editionを使用できます。 無料でダウンロード、メモリ内、列指向であり、テキスト分析、地理空間、予測などの分析機能を追加できます。 ODBC、JDBC、node.js hdbライブラリ、REST APIなどを使用してアクセスすることもできます。