リードスルー キャッシュ プロバイダーの構成と実装
リードスルーキャッシュを使用するには、 IReadThruProvider
.NET 用のインターフェイスと ReadThruProvider
Java用のインターフェース。 NCache このカスタム実装を使用して、データソースからデータを読み取ります。 参照してください 管理者ガイドの「リードスルーの再設定」 のガイドをご参照ください。
警告
リードスルー キャッシュ プロバイダーが指定されている場合 client.ncconf セクションに default-readthru-provider
タグとAPIを介して、APIのプロバイダーはで指定されたものを上書きします client.ncconf.
重要
Javaの場合、Mavenの依存関係を追加する前に、次のことを確認する必要があります。
- JDK 17 インストールされています。
- Javaの環境変数が設定されています。
前提条件
- すべてを使用するために必要な標準的な前提条件について学習するには NCache リードスルー キャッシュを含むサーバー側の機能については、次のページを参照してください。 サーバー側 API の前提条件.
- これは、MicrosoftVisualStudioを使用したクラスライブラリプロジェクトである必要があります。
- ユーザーとの強い関係を維持するために、 ReadThroughプロバイダーをデプロイする NCache 管理センター。
- APIの詳細については、以下を参照してください。 IReadThruProvider, ソースからロード, LoadDataTypeFromSource.
Note
In NCache, リードスルー キャッシュ プロバイダーはキャッシュ レベルで構成されます。つまり、クラスター化キャッシュの場合、すべてのノードにプロバイダー構成とそのデプロイされたアセンブリが含まれます。
ReadThrough キャッシュ プロバイダーのサンプル実装
次のコード サンプルは、 IReadThruProvider
.NET のクラスと ReadThruProvider
Javaのクラス。 The LoadFromSource
および LoadDataTypeFromSource
メソッドには、オブジェクトがキャッシュ内に見つからない場合に、構成されたデータ ソースからオブジェクトまたはデータ型をそれぞれロードするロジックが含まれています。 また、 GetConnectionString
構成されたデータソースの接続文字列を返します。
public class SampleReadThruProvider : IReadThruProvider
{
private SqlConnection _connection;
//Perform tasks like allocating resources or acquiring connections
public void Init(IDictionary parameters, string cacheId)
{
object server = parameters["server"];
object userId = parameters["username"];
object password = parameters["password"];
object database = parameters["database"];
string connString = GetConnectionString(server.ToString(), database.ToString(), userId.ToString(), password.ToString());
if (connString != "")
_connection = new SqlConnection(connString);
try
{
_connection.Open();
}
catch (Exception ex)
{
//handle exception
}
}
// Responsible for loading an item from the external data source
public ProviderCacheItem LoadFromSource(string key)
{
// LoadFromDataSource loads data from data source
object value = LoadFromDataSource(key);
var cacheItem = new ProviderCacheItem(value);
return cacheItem;
}
//Responsible for loading bulk of items from the external data source
public IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection<string> keys)
{
var dictionary = new Dictionary<string, ProviderCacheItem>();
try
{
foreach (string key in keys)
{
// LoadFromDataSource loads data from data source
dictionary.Add(key, new ProviderCacheItem(LoadFromDataSource(key)));
}
return dictionary;
}
catch (Exception exp)
{
// Handle exception
}
return dictionary;
}
// Adds ProviderDataTypeItem with enumerable data type
public ProviderDataTypeItem<IEnumerable> LoadDataTypeFromSource(string key, DistributedDataType dataType)
{
IEnumerable value = null;
ProviderDataTypeItem<IEnumerable> dataTypeItem = null;
switch (dataType)
{
case DistributedDataType.List:
value = new List<object>()
{
LoadFromDataSource(key)
};
dataTypeItem = new ProviderDataTypeItem<IEnumerable>(value);
break;
case DistributedDataType.Dictionary:
value = new Dictionary<string, object>()
{
{ key , LoadFromDataSource(key) }
};
dataTypeItem = new ProviderDataTypeItem<IEnumerable>(value);
break;
case DistributedDataType.Counter:
dataTypeItem = new ProviderDataTypeItem<IEnumerable>(1000);
break;
}
return dataTypeItem;
}
//Perform tasks associated with freeing, releasing, or resetting resources.
public void Dispose()
{
if (_connection != null)
{
_connection.Close();
}
}
private object LoadFromDataSource(string key)
{
object retrievedObject = null;
// Load item from your data source and populate retrieved Object
return retrievedObject;
}
private string GetConnectionString(string server, string database, string userName, string password)
{
string connectionString = null;
try
{
if (!string.IsNullOrEmpty(server))
{
connectionString = "Server=" + server + ";";
}
else
{
//Server name is empty
}
if (!string.IsNullOrEmpty(database))
{
connectionString = connectionString + "Database=" + database + ";";
}
else
{
//Database is empty;
}
if (!string.IsNullOrEmpty(userName))
{
connectionString = connectionString + "User ID=" + userName + ";";
}
else
{
connectionString = connectionString + "User ID=" + "" + ";";
}
if (!string.IsNullOrEmpty(password))
{
connectionString = connectionString + "Password=" + password + ";";
}
else
{
connectionString = connectionString + "Password=" + "" + ";";
}
}
catch (Exception exp)
{
// Handle exception
}
return connectionString;
}
// Deploy this class on cache
}
Note
操作がフェイルセーフであることを保証するために、で説明されているように、アプリケーション内の潜在的な例外を処理することをお勧めします。 失敗の処理.
その他のリソース
NCache Read-Through のサンプル アプリケーションを提供します。 GitHubの.
も参照してください
。ネット: Alachisoft.NCache。ランタイム 名前空間
Java: comの。alachisoft.ncache.runtime.datasourceprovider 名前空間