Dipendenza della cache di SQL Server
Ci sono vari meccanismi in NCache per mantenere i dati sincronizzati nella cache. Potrebbe esserci uno scenario in cui l'utente desidera mantenere i dati sincronizzati con il database, quindi ogni aggiornamento del database avvisa la cache. In questo modo i dati nella cache rimangono aggiornati e le operazioni vengono eseguite sul set di dati aggiornato.
NCache fornisce la funzionalità della dipendenza SQL per sincronizzare la cache con Microsoft SQL Server 2005 in poi. Viene aggiunto un elemento con SqlCacheDependency (fornito da NCache), specificando un'istruzione SQL che rappresenta un set di risultati di query nel database. NCache quindi stabilisce un collegamento con il database rispetto al set di risultati. Se un'applicazione si aggiorna, SQL Server genera notifiche di eventi, che NCache cattura e rimuove l'elemento corrispondente dalla cache distribuita.
Prima di utilizzare la dipendenza SQL, configurare l'ambiente SQL Server. Per creare una dipendenza SQL:
- Abilita servizio broker
- Abilita le autorizzazioni del database
Per ulteriori dettagli si rimanda al Configurare l'ambiente di SQL Server sezione nella Guida dell'amministratore.
Prerequisiti per utilizzare la dipendenza della cache di SQL Server
Aggiungi dati con dipendenza SQL Server tramite API
Per aggiungere dati nella cache utilizzando la dipendenza SQL, NCache fornisce il SqlCacheDependency
classe. Ciò aggiunge elementi alla cache con dipendenza SQL.
L'esempio seguente aggiunge la dipendenza SQL a un elemento e quindi aggiunge l'elemento alla cache utilizzando il metodo Insert
metodo. Il Insert
Il metodo aggiunge un nuovo elemento con dipendenza e, se questi dati esistono già nella cache, li sovrascrive.
// Creating connection string to get connected with database.
string connectionString = "your_connection_string_here";
// Getting products from database.
List<Product> products = FetchProductFromDB();
foreach (Product product in products)
{
string productKey = $"Product: {product.ProductID}";
// Creating an SQL dependency on the UnitPrice of product. Whenever the UnitPrice changes, the product is removed from the cache.
string query = $"SELECT UnitPrice FROM dbo.Products WHERE ProductID = {product.ProductID}";
// Creating dependency.
SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query);
CacheItem productItem = new CacheItem(product);
// Adding Dependency to product item
productItem.Dependency = dependency;
// Adding CacheItem in cache
_cache.Add(productKey, productItem);
}
// Creating connection spring to get connected with database
String connectionString = "your_connection_string_here";
// Getting products from the database
List<Product> products = FetchProductFromDB();
for (Product product : products) {
String productKey = "Product:" + product.getProductID();
// Creating an SQL dependency on the UnitPrice of the product. Whenever the UnitPrice changes, the product is removed from the cache.
String query = "SELECT UnitPrice FROM dbo.Products WHERE ProductID = " + product.getProductID();
// Creating a dependency
SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query);
CacheItem productItem = new CacheItem(product);
// Adding Dependency to the product item
productItem.setDependency(dependency);
// Adding CacheItem to the cache
cache.add(productKey, productItem);
System.out.println("Product added to cache: " + productKey);
}
// This is an async method
// Creating a connection string to establish connection with the database
var connection = new ActiveXObject("adodb.connection");
let connString = "your_connection_string_here";
let query = "SELECT CustomerID, Address, City FROM dbo.Customers WHERE CustomerID = ?";
let queryCommand = new QueryCommand(query);
queryCommand.getParameters().put("CustomerID", this.customerId);
connection.Open(query, connString);
// Creating SQL dependency
let sqlDependency = new ncache.SqlCacheDependency(connString, query);
// Get orders against customerId
let orders = await this.fetchOrdersByCustomerId(this.customerId);
for (let order in orders)
{
// Generate a unique key for this order
let key = "Order:" + order.OrderId;
// Create a new cache item and add sql dependency to it
let cacheItem = new ncache.CacheItem(order);
cacheItem.setDependency(sqlDependency);
// Add cache item in the cache with sql dependency
await this.cache.insert(key, cacheItem);
// For successful addition of item with SQL Dependency
// Update the record in the database and check if key is present
}
connection.close();
# Creating a connection string to establish connection with the database
conn_string = "your_connection_string_here"
query = "SELECT CustomerID, Address, City FROM dbo.Customers WHERE CustomerID = ?"
query_command = ncache.QueryCommand(query)
query_command.set_parameters({"CustomerID": "ALFKI"})
# Creating SQL dependency
sql_dependency = ncache.SqlCacheDependency(conn_string, query)
# Get orders against Customer ID
orders = fetch_orders_by_customer_id("ALFKI")
for order in orders:
# Generate a unique key for this order
key = "Order:" + order.get_order_id()
# Create a new cache item and add sql dependency to it
cache_item = ncache.CacheItem(order)
cache_item.set_dependency(sql_dependency)
# Add cache item in the cache with sql dependency
cache.insert(key, cache_item)
# For successful addition of item with SQL Dependency
# Update the record in the database and check if key is present
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.
Aggiungi dati con dipendenza SQL utilizzando Stored procedure
NCache consente di fornire una dipendenza SQL su un elemento utilizzando una procedura memorizzata. È inoltre possibile specificare i parametri da passare insieme a questa procedura utilizzando il comando SqlCacheDependency
metodo.
L'esempio seguente aggiunge un elemento alla cache con dipendenza SQL tramite la procedura memorizzata utilizzando il file inserire metodo. Il Insert
Il metodo aggiunge un nuovo elemento con dipendenza e, se questi dati esistono già nella cache, ne sovrascrive le proprietà.
// Creating connection string to get connected with database.
string connectionString = "your_connection_string_here";
string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID";
// Getting products from database.
List<Product> products = FetchProductFromDB();
// Creating dictionary of CacheItems.
Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>();
foreach (Product product in products)
{
string productKey = $"Product: {product.ProductID}";
// Creating Param to be passed in stored procedure dictionary.
SqlCmdParams paramProductID = new SqlCmdParams
{
Type = CmdParamsType.Int,
Value = product.ProductID
};
// Creating stored procedure params.
Dictionary<string, SqlCmdParams> parameters = new Dictionary<string, SqlCmdParams>();
parameters.Add("@ProductID", paramProductID);
CacheItem productItem = new CacheItem(product);
// Creating an SQL dependency on the UnitPrice of product. Whenever the UnitPrice changes, the product is removed from the cache.
SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters);
// Adding Dependency to product item
productItem.Dependency = dependency;
cacheItems.Add(productKey, productItem);
}
// Adding CacheItems in cache
_cache.AddBulk(cacheItems);
String connectionString = "your_connection_string_here";
String spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID";
// Getting products from the database
List<Product> products = FetchProductFromDB();
// Create a map to store CacheItems.
Map<String, CacheItem> cacheItems = new HashMap<>();
for (Product product : products) {
String productKey = "Product:" + product.getProductID();
// Creating Param to be passed in the stored procedure dictionary.
SqlCmdParams paramProductID = new SqlCmdParams();
paramProductID.setCmdParamsType(CmdParamsType.Int);
paramProductID.setValue(product.getProductID());
// Creating stored procedure params.
Map<String, SqlCmdParams> parameters = new HashMap<>();
parameters.put("@ProductID", paramProductID);
CacheItem productItem = new CacheItem(product);
// Creating an SQL dependency on the UnitPrice of the product. Whenever the UnitPrice changes, the product is removed from the cache.
SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters);
// Adding Dependency to the product item.
productItem.setDependency(dependency);
cacheItems.put(productKey, productItem);
System.out.println("Added product to cache items: " + productKey);
}
// Adding CacheItems in cache using addBulk method.
cache.addBulk(cacheItems);
System.out.println("Products added to cache.");
// This is an async method
// Creating a connection string to establish connection with the database
var connection = new ActiveXObject("adodb.connection");
let connString = "your_connection_string_here";
connection.Open(connString);
// Name of the stored procedure item is dependent un
let storedProcName = "GetCustomerByID";
// Specify the customerID passed as parameters
let sqlCmdParams = new Map();
sqlCmdParams.set("CustomerID", this.customerId);
// Create sql dependency
// In case the stored procedure has no parameters, pass null as the SqlCmdParams value
let sqlCacheDependency = new ncache.SqlCacheDependency(connString, storedProcName,
ncache.SqlCommandType.StoredProcedure, sqlCmdParams);
// Get orders from database against customerId
let orders = await this.fetchOrdersByCustomerId(this.customerId);
for (let order in orders)
{
// Generate a unique cache key for this order
let key = "Order:" + order.OrderId;
// Create a new cache item and add sql dependency to it
let item = new ncache.CacheItem(order);
item.setDependency(sqlCacheDependency);
// Add cache item in the cache with sql dependency
this.cache.insert(key, item);
// For successful addition of item with SQL Dependency
// Update the record in the database and check if key is present
}
connection.close();
# Creating a connection string to establish connection with the database
conn_string = "your_connection_string_here"
# Name of the stored procedure item is dependent upon
stored_proc_name = "GetCustomerByID"
# Specify the customerID passed as parameters
sql_cmd_params = {"CustomerID": "ALFKI"}
# Create sql dependency
# In case the stored procedure has no parameters, pass null as the SqlCmdParams value
sql_cache_dependency = ncache.SqlCacheDependency(conn_string, stored_proc_name, ncache.SqlCommandType.STORED_PROCEDURE, sql_cmd_params)
# Get orders from database against customerId
orders = fetch_orders_by_customer_id("ALFKI")
for order in orders:
# Generate a unique cache key for this order
key = "Order:" + order.get_order_id()
# Create a new cache item and add sql dependency to it
item = ncache.CacheItem(order)
item.set_dependency(sql_cache_dependency)
# Add cache item in the cache with sql dependency
cache.insert(key, item)
# For successful addition of item with SQL Dependency
# Update the record in the database and check if key is present
Consigli
- In un ambiente in cui l'utente ha un accesso più limitato al database, gli utenti dovrebbero creare il servizio SQL e la coda per NCache processo controllando il "Usa la modalità di notifica SQL personalizzata” nella casella di controllo Opzioni linguetta nella NCache Centro Direzionale.
- È inoltre possibile creare il servizio SQL e la coda richiesti utilizzando lo script NCacheServiceQueue.sql situato in %NCHOME%\bin\resources.
Risorse addizionali
NCache fornisce un'applicazione di esempio per la dipendenza SQL da GitHub.
Vedere anche
.NETTO: Alachisoft.NCache.Dipendenze.di.runtime spazio dei nomi.
Giava: com.alachisoft.ncache.dipendenze.di.runtime spazio dei nomi.
Node.js: SqlCacheDependency classe.
Pitone: ncache.dipendenze.di.runtime classe.