2013-02-23 15 views
5

SQL Serverデータベースを使用してキャッシュされたオブジェクトを格納するカスタマイズされたキャッシュソリューションを開発しています。アプリケーションのホスティング環境はmemcachedやappファブリックなどの「メモリ内」キャッシュを提供しないため、SQL Serverデータベースを使用する必要があります。シリアル化されたオブジェクトをSQL Serverデータベースに格納するために使用するシリアル化形式

キャッシュされたオブジェクトのほとんどは単純な型(int、string、datesなど)ですが、DataSetDataTable、ジェネリックコレクション、カスタムクラスなどのより複雑な型も格納する必要があります。

私は.NETのネイティブなシリアライゼーションとデシリアライズの経験はほとんどありませんが、オブジェクトをある種のフォーム(バイナリ、XML、JSONなど)にシリアル化してデータベースに格納し、私たちはそれをデータベースから取り出します。私は、「何らかの形」が何であるべきかについて専門家の意見を持っていたいと思います。

JSON.NETを使用して、さまざまなAJAXリクエストに対してJSONにデータをシリアル化しています。私の最初の考えは、キャッシュされたデータをJSONにシリアル化してデータベースに格納することでした。しかし、パフォーマンスとデータの完全性のために何が最善であろうといくつかの意見を出したいと思っていました。

+0

ASP.NETには[組み込みのキャッシュサポート](http://msdn.microsoft.com/en-us/library/xsbfdd8c(v=vs.100).aspx)があります。あなたはそれを試しましたか? – Andomar

+0

@Andomar - サイトが存在するホスティング環境では、負荷分散のためのラウンドロビンタイプの構成を使用し、ホストはAppFabricをサポートしていないか、あらゆる種類のメモリキャッシュを提供しています。状況は多かれ少なかれ、私たちが持っているものを最大限活用するという点で、開発者とホスティング環境との対比です。 –

答えて

8

あなたが言いました3つのシリアライゼーションオプション(バイナリ、jsonまたはXML)は、シリアル化フォーマットの有効な選択肢です。 many other serialization formatsがありますが、上記の3つが最も一般的です。 3の間で選択するように、ここでの考察の一部です:

  1. あなたは、データベース内のバイナリ形式でデータを保存する場合は、あなたが今まで使用して経由でそれを見たい場合ならば、それが読める人間ではありませんSQL Server Management Studioを使用するか、テキストエディタを使用します。手動でデータを閲覧したい場合は、ある種の逆シリアル化ツールを作成する必要があります。

  2. バイナリ形式の場合、シリアル化オブジェクトのサイズが最も小さく、その後にJSONが続き、XMLが最大になります。実際のサイズの違いは、データ構造によって異なります。

  3. パフォーマンスに関しては、バイナリのシリアル化はjsonやXMLより高速です。ただし、データを基準にベンチマークを行って、その違いを確認する必要があります。

  4. 私は優れた.netライブラリとBCLサポートの3つのフォーマットのすべての種類のため、任意の選択肢ができるはずだと思う。

このように、CPU使用率、ディスク容量、人の読みやすさ、および/または個人的な好みによって、どの要素が最も重要かが決まります。

私たちはデータベースに格納するオブジェクトを逐次化するために、JSON.Netを使用していました。 SSMS経由で手動でデータを表示すると便利なこともあり、jsonはXMLよりもデータに対してかなりコンパクトです。

+1

しかし、SSMSでJSONを本当に照会することはできませんが、XMLを照会することはできます。私はもっ​​と大きくてもXMLを好むだろう。 – Icarus

+0

良い点、@イカルス。 SQL Serverの高度なXMLクエリ機能をすべて利用したい場合は、特に追加のストレージサイズを許容できる場合は、XMLにシリアル化する必要があります。 –

+0

ありがとうございます。私たちはあなたのすべての点を考慮に入れます。ベスト。 –

3

彼が死んでいるので、私はジョーの答えを繰り返さない。私はクラスをアップグレードする場合、バイナリシリアライゼーションは複雑さを増やすと付け加えたいと思います。それは扱いやすいですが、少し作業が必要で、バイナリシリアライザを掘り下げる必要があります。テキストベースのアプローチでは、他のオプション(XMLではXSLTを実行するなど)を使用してデータを移行できます。

+1

バイナリのシリアル化に関するこの点についてJoshに感謝します。バイナリシリアライゼーションを行っている場合は、アプリケーションの完全なサポートライフタイムにわたってメンテナンスを考慮する必要があります。 –

+0

@JoeAlfanoええ、永続エンティティであるバイナリのシリアル化されたオブジェクトグラフが残っています。私は痛みについて話します....しかし、私はそれらのオブジェクト名と型を変更し、それらを移行することを管理してきました... – JoshBerke

2

キャッシュは小さくて速くなければならず、使い方について具体的に説明したいと思います。

私はprotobuf-netと同じですので、使用して、私はそれを使用し、サイズと一緒に速度が本当に良いです示唆しています。少なくとも私のテストでは、小さくて速いです。

他のシリアライゼーションライブラリを試してみたのと同じ理由で(キャッシュ用に)これを使用しますが、これは結果がより速く小さくなりました。今ではキャッシュスキーマでは、あなたが実際にその機能を修正していないので、何かを変更する必要があるかもしれない設定ではないので、実際には何が目に見える必要はありません。

キャッシュオブジェクトのwhatsを見たい場合は、それを印刷する簡単な関数を作成できます。

関連する問題