Configuration et mise en œuvre du fournisseur de mise en cache en lecture seule
Pour utiliser la mise en cache Read-Through, vous devez implémenter le IReadThruProvider
interface pour .NET et le ReadThruProvider
interface pour Java. NCache utilisera cette implémentation personnalisée pour lire les données de la source de données. Prière de se référer à Configuration de la reconfiguration Lecture directe dans le Guide de l'administrateur pour plus de détails.
Si un fournisseur de mise en cache Read-Through est spécifié dans client.ncconf dans le default-readthru-provider
balise et également via l'API, le fournisseur dans l'API écrasera celui spécifié dans client.ncconf.
Important
Pour Java, avant d'ajouter des dépendances Maven, vous devez vous assurer que :
- JDK 17 est installé.
- La variable d'environnement pour Java est définie.
Pré-requis
- Pour en savoir plus sur les prérequis standard requis pour travailler avec tous NCache fonctionnalités côté serveur, y compris la mise en cache Read-Through, veuillez vous référer à la page donnée sur Prérequis de l'API côté serveur.
- Il doit s'agir d'un projet de bibliothèque de classes utilisant Microsoft Visual Studio.
- Assurez-vous de Déployer le fournisseur de lecture utilisant l' NCache Centre de gestion.
- Pour plus de détails sur l'API, reportez-vous à : IReadThruProvider, ChargerDepuisSource, LoadDataTypeFromSource.
Notes
In NCache, Les fournisseurs de mise en cache en lecture continue sont configurés au niveau du cache, c'est-à-dire que pour les caches en cluster, tous les nœuds contiendront les configurations de fournisseur et leurs assemblys déployés.
Exemple d’implémentation pour le fournisseur de mise en cache ReadThrough
L'exemple de code suivant fournit un exemple d'implémentation pour configurer un fournisseur de mise en cache en lecture continue à l'aide de l'option IReadThruProvider
classe pour .NET et le ReadThruProvider
classe pour Java. Le LoadFromSource
ainsi que LoadDataTypeFromSource
Les méthodes contiennent une logique pour charger respectivement un objet ou un type de données à partir de la source de données configurée si l'objet n'est pas trouvé dans le cache. Également GetConnectionString
renvoie la chaîne de connexion pour la source de données configurée.
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
}
Notes
Pour garantir la sécurité de l'opération, il est recommandé de gérer toutes les exceptions potentielles au sein de votre application, comme expliqué dans Gestion des échecs.
Ressources additionnelles
NCache fournit un exemple d'application pour la lecture continue sur GitHub.
Voir aussi
.RAPPORTER: Alachisoft.NCache.Durée espace de noms.
Java: com.alachisoft.ncache.runtime.datasourceprovider espace de noms.