Configurazione e implementazione del provider di memorizzazione nella cache read-through
Per utilizzare la memorizzazione nella cache Read-Through, è necessario implementare il IReadThruProvider
interfaccia per .NET e ReadThruProvider
interfaccia per Java. NCache utilizzerà questa implementazione personalizzata per leggere i dati dall'origine dati. Per favore riferisci a Configurazione della ri-configurazione Read-Through nella Guida dell'amministratore per ulteriori dettagli.
avvertimento
Se è specificato un provider di caching Read-Through in client.ncconf nel default-readthru-provider
tag e anche tramite API, quindi il provider in API sovrascriverà quello specificato in client.ncconf.
Consigli
Per Java, prima di aggiungere dipendenze Maven, devi assicurarti che:
- JDK 17 è installato.
- La variabile di ambiente per Java è impostata.
Prerequisiti
- Per conoscere i prerequisiti standard richiesti per lavorare con all NCache Per le funzionalità lato server, inclusa la memorizzazione nella cache Read-Through, fare riferimento alla pagina specificata Prerequisiti API lato server.
- Questo dovrebbe essere un progetto di libreria di classi che usa Microsoft Visual Studio.
- Assicurati che Distribuire il provider ReadThrough usando il NCache Centro Direzionale.
- Per i dettagli dell'API fare riferimento a: IReadThruProvider, Carica da origine, Caricatipodatidaorigine.
Note:
In NCache, I provider di caching Read-Through sono configurati a livello di cache, ovvero per le cache in cluster tutti i nodi conterranno le configurazioni dei provider e i relativi assembly distribuiti.
Implementazione di esempio per il provider di memorizzazione nella cache ReadThrough
L'esempio di codice seguente fornisce un'implementazione di esempio per configurare un provider di memorizzazione nella cache Read-Through utilizzando IReadThruProvider
classe per .NET e ReadThruProvider
classe per Java. Il LoadFromSource
ed LoadDataTypeFromSource
i metodi contengono la logica per caricare un oggetto o un tipo di dati rispettivamente dall'origine dati configurata se l'oggetto non viene trovato nella cache. Anche il GetConnectionString
restituisce la stringa di connessione per l'origine dati configurata.
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:
Per garantire che l'operazione sia a prova di errore, si consiglia di gestire eventuali potenziali eccezioni all'interno dell'applicazione, come spiegato in Gestione dei guasti.
Risorse addizionali
NCache fornisce un'applicazione di esempio per Read-Through GitHub.
Vedere anche
.NETTO: Alachisoft.NCache.Durata spazio dei nomi.
Giava: com.alachisoft.ncache.runtime.datasourceprovider spazio dei nomi.