Configuração e implementação do provedor de cache de leitura
Para usar o cache Read-Through, você precisa implementar o IReadThruProvider
interface para .NET e o ReadThruProvider
interface para Java. NCache usará essa implementação personalizada para ler dados da fonte de dados. Por favor consulte Configurando a reconfiguração da leitura no Guia do administrador para mais detalhes.
Aviso
Se um provedor de cache Read-Through for especificado em cliente.ncconf no default-readthru-provider
tag e também por meio da API, o provedor na API substituirá o especificado em cliente.ncconf.
importante
Para Java, antes de adicionar dependências do Maven, você precisa ter certeza de que:
- JDK 17 está instalado.
- A variável de ambiente para Java está definida.
Pré-requisitos
- Para aprender sobre os pré-requisitos padrão necessários para trabalhar com todos os NCache recursos do lado do servidor, incluindo cache de leitura, consulte a página fornecida em Pré-requisitos da API do lado do servidor.
- Este deve ser um projeto de biblioteca de classes usando o Microsoft Visual Studio.
- Tenha certeza de Implantar Provedor ReadThrough usando o NCache Centro de Gestão.
- Para detalhes da API, consulte: IReadThruProvider, CarregarFromSource, LoadDataTypeFromSource.
Note
In NCache, os provedores de cache Read-Through são configurados no nível do cache, ou seja, para caches clusterizados, todos os nós conterão configurações do provedor e seus assemblies implementados.
Exemplo de implementação para provedor de cache ReadThrough
O exemplo de código a seguir fornece um exemplo de implementação para configurar um provedor de cache de leitura usando o método IReadThruProvider
classe para .NET e o ReadThruProvider
classe para Java. o LoadFromSource
e LoadDataTypeFromSource
Os métodos contêm lógica para carregar um objeto ou tipo de dados, respectivamente, da fonte de dados configurada, se o objeto não for encontrado no cache. Também o GetConnectionString
retorna a cadeia de conexão para a fonte de dados configurada.
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
Para garantir que a operação seja à prova de falhas, é recomendável lidar com possíveis exceções em seu aplicativo, conforme explicado em Como lidar com falhas.
Recursos adicionais
NCache fornece um aplicativo de exemplo para leitura em GitHub.
Veja também
.INTERNET: Alachisoft.NCache.Tempo de execução espaço para nome.
Java: com.alachisoft.ncache.runtime.datasourceprovider espaço para nome.