• Webinars
  • Docs
  • Download
  • Blogs
  • Contact Us
Show / Hide Table of Contents
  • Programmer's Guide
  • Client Side API Programming
    • Setting Up Development Environment
    • Basic Cache Operations
      • Initialize Cache
      • Add Data to Cache
      • Update Data in Cache
      • Fetch Data From Cache
      • Remove Data From Cache
      • Dispose Cache
    • Bulk Operations
      • Adding Collection to Cache
      • Updating Collection in Cache
      • Retrieving Collection from Cache
      • Removing Collection from Cache
      • Deleting Collection from Cache
    • Asynchronous Operations
      • Using Asynchronous Operations
      • Using Asynchronous Operations with Callback Methods
    • Groups and Subgroups
      • Adding/Updating Data Group in Cache
      • Retrieving Data Group from Cache
      • Removing Data Group from Cache
    • Tagging Data in NCache
      • Creating Tags
      • Adding Items with Tags
      • Retrieving Previously Tagged Data
      • Removing Tagged Items from Cache
    • Named Tags
    • Data Expiration Strategies
      • Using Absolute Expiration
      • Using Sliding Expiration
    • Cache Dependencies
      • Key Dependency
      • File Dependency
      • Notification based Dependencies
        • Database Dependency using SQL Server
        • Database Dependency using Oracle
      • Polling Based Dependency
      • Custom Data Source Dependency
      • Multiple Cache Sync Dependency
      • Aggregate Dependency
      • Add Dependency to Existing Item
      • Using CLR Procedures to Call NCache
    • Locking Data in NCache
      • Locking Items in Cache (Pessimistic Locking)
      • Locking Items with Cache Item Versioning (Optimistic Locking)
    • SQL Reference for NCache
      • SQL Syntax
      • Querying Samples for Operators
      • Querying Data in NCache
      • NCache Language Integrated Query (LINQ)
        • Using LINQ in NCache
        • Configuring LINQPad for NCache
        • Querying NCache Data in LINQPad
    • Event Notifications
      • Cache Level Event Notifications
      • Item Level Event Notifications
      • Custom Event Notifications
    • Publish/Subscribe (Pub/Sub) in NCache
      • Pub/Sub Topics
      • Managing Topics
      • Pub/Sub Messages
        • Message Behavior and Properties
        • Creating a Message
      • Publish Messages to Topic
      • Subscribe for Topic Messages
      • Monitoring Pub/Sub Topics
    • Continuous Query
    • Using Streams in NCache
      • Opening with Stream Modes
      • Adding and Updating Data with Streams
      • Retrieving Data from Streams
      • Closing a Stream
    • Security and Encryption
      • NCache Security
      • NCache Data Encryption
    • Data Compression
    • NCache Management API
  • Server Side API Programming
    • Cache Startup Loader
      • Components of Cache Startup Loader
      • Sample Implementation of ICacheLoader on Single Node
      • Sample Implementation of ICacheLoader with Distribution Hints
    • Data Source Providers (Backing Source)
      • Read-Through Caching
        • Configure Read-Through Provider
        • Using Read-Through with Cache Operations
      • Write-Through Caching
        • Configuring Write-Through Provider
        • Using Write-Through with Basic Operations
        • Using Write-Behind with Basic Operations
        • Using Write-Behind with Bulk Operations
        • Using Write-Behind with Async Operations
        • Monitor Write-Through Counters
    • Custom Dependency
      • Sample Implementation of Custom Dependency
      • Sample Usage of Custom Dependency
    • WAN Replication through Bridge
      • Bridge Configurations
      • Implementing Bridge Conflict Resolver
    • Entry Processor
      • Sample Implementation of IEntryProcessor Interface
      • Sample Usage of EntryProcessor
    • MapReduce
      • Sample Implementation of MapReduce Interfaces
      • Sample Usage of MapReduce
    • Aggregator
      • Sample Implementation of IValueExtractor Interface
      • Sample Implementation of IAggregator Interface
      • Sample Usage of Aggregator
    • Dynamic Compact Serialization
  • Client Side ASP.NET Features
    • ASP.NET
      • ASP.NET Session State Provider for NCache
      • Multi-Region ASP.NET Session State Provider for NCache
    • ASP.NET Core
      • Session Storage in ASP.NET Core
        • Configure NCache ASP.NET Core Session Provider
        • Configure ASP.NET Core Sessions with NCache IDistributedCache Provider
      • Multi-Region ASP.NET Core Session Provider for NCache
      • Object Caching in ASP.NET Core
    • ASP.NET SignalR
      • Using NCache Extension for SignalR
    • View State Caching
      • Configuring and Using Content Optimization
      • Group View State with Sessions
      • Limit View State Caching
      • Perform Page Level Grouping for View State
    • ASP.NET Output Cache
      • Configure ASP.NET Output Caching
      • Using ASP.NET Output Cache with Custom Hooks
  • Client Side Third Party Integrations
    • Migrating AppFabric to NCache
      • AppFabric API vs. NCache API
    • NHibernate
      • NCache as NHibernate Second Level Cache
      • Using NHibernate Query Caching
      • Configuring Database Synchronization with NHibernate
    • Entity Framework Caching Integration
      • NCache as Entity Framework Second Level Cache
      • Entity Framework Caching Config File
    • Entity Framework Core Caching
      • Installing NCache Entity Framework Core Provider
      • Configuring NCache Entity Framework Core Provider
      • Using NCache Entity Framework Core Provider
        • Caching Options for EF Core Provider
        • LINQ APIs for EF Core Provider
        • Cache Only APIs for EF Core Provider
        • Query Deferred APIs for EF Core Provider
      • Logging in NCache Entity Framework Core Provider
    • Memcached
      • NCache Memcached Gateway Approach
      • Memcached Client Plugin for .NET
    • Debug NCache Providers in Visual Studio
    • NCache for Visual Studio Extension

Configuring WriteThru Provider

To use Write-through caching, you need to implement the IWriteThruProvider interface provided by NCache. NCache framework will use this custom implementation to write data on the back-end data source. Please refer to Configuring Write-through in Administrators' Guide for more details.

Note that if a read-through provider is specified in client.ncconf in the default-writethru-provider tag, and has also been specified through API, the provider in API will overwrite the one specified in client.ncconf.

IWriteThruProvider Interface

Member Description
Init This method will be called by NCache on cache startup. User can use this method for performing tasks like allocating resources, acquiring connections of data source etc. This method takes as input the HashMap instance of arguments passed to the provider through NCache Manager (configuration settings). It allows you to pass a list of parameters to the provider. These parameters can be utilized in many ways. For example, connection string of a data source can be specified as a parameter. Thus, it provides a flexible way to change the data source settings while configuring it without any code changes. The other argument CacheId specifies the cache name for which write-through is configured.
WriteToDataSource This method will be called by NCache to perform an actual write operation on a configured data source.

-For write-through, an atomic operation with write-through will correspond to an atomic writeToDataSource method in provider while in the case of a bulk operation NCache will call bulk writeToDataSource method from the provider.

-For write-Behind, NCache will call the atomic writeToDataSource method if non-batch mode is enabled while the bulk writeToDataSource method will be called in case of batch mode. This method should contain logic to perform operation on configured data source. The argument WriteOperation contain the key, operation type (Add, Insert, Remove/Delete), retry count and provider cache item. You will implement this method to perform write operations on data source according to operation type and return it to NCache as OperationResult. See below for details on OperationResult.

Dispose This method will be called by NCache when the cache stops. You can use this method for performing tasks like releasing resources, disposing connections etc. Here you can free the resources related to data sources for effective resource utilization.

OperationResult holds information about:

  • WriteOperation: Operation performed on data source.
  • UpdateInCache: This flag specifies whether to update the returned write operation in cache or not. This is only applicable for Add and Insert operation types. In NCache an operation is first applied on cache store and then to data source (if write through caching is enabled). So if user wants to synchronize the cache store after updating data source then this flag will be used.
  • Status: Write through caching basically synchronizes your data source with cache store. Previously in case of operation failure on data source, item was also removed from cache, now NCache provides more flexible ways to allow user to decide whether to keep the item in cache based on these operation statuses.
  • Success: This means item was successfully added to the data source so keep it in the cache as well.
  • Failure: This means item could not be added to data source, so in case of Add/Insert operations, item will be removed from cache. Operation failure exception will be thrown to user in case of Write-Through and logged in case of write behind.
  • FailureDontRemove: This means item could not be added to the data source, but keep it in the cache. Operation failure exception will be thrown to user in case of write thru and logged in case of write behind.
  • FailureRetry: This means item could not be added to the data source, keep the item in cache and retry. In case of write thru retry will be performed as write behind operation. While implementing this method, you should take care of code thread safety as multiple requests can access

    Note

    In NCache, write-through providers are configured on cache level i.e. for clustered caches all nodes will contain provider configurations and their deployed assemblies.

    Sample Implementation of IWriteThruProvider Interface

    To utilize the IWriteThruProvider, include the following namespace in your application: Alachisoft.NCache.Runtime.DatasourceProviders.

    After implementing and deploying this provider, you can make direct calls to NCache for write operations on the data source. NCache will use the "writeToDataSource" method in the specified data access class to write operations on data source.

    // Contains methods used to save/update an object to the master data source.
    public class SampleWriteThruProvider : IWriteThruProvider
    {
        // Object used to communicate with the Data source.
        private SqlConnection _connection;
    
        //Perform tasks like allocating resources or acquiring connections
        public void Init(IDictionary parameters, string cacheId)
        {
            object connStringObject = parameters["connstring"];
            string connString = connStringObject == null ? "" : connStringObject.ToString();
    
            if (connString != ""){
                _connection = new SqlConnection(connString);
            }
    
            try{
                _connection.Open();
            }
            catch (Exception ex){
              //handle exception
            }
        }
    
        //Perform tasks associated with freeing, releasing, or resetting resources.
        public void Dispose()
        {
            if (_connection != null)
                _connection.Close();
        }
    
        //Responsible for write operations on data source
        public OperationResult WriteToDataSource(WriteOperation operation)
        {
            Product product = (Product)operation.ProviderCacheItem.Value;
    
            SqlCommand command = new SqlCommand();
            command.Connection = _connection;
    
            if (operation.OperationType == WriteOperationType.Add){
              command.CommandText = "INSERT INTO Products(ID,Name)VALUES( '" + operation.Key + "','" + product.ProductName + "')";
            }
    
            if (operation.OperationType == WriteOperationType.Delete){
              command.CommandText = "DELETE FROM Products WHERE ID ='" + operation.Key + "'";
            }
    
            if (operation.OperationType == WriteOperationType.Update){
              command.CommandText = "UPDATE Products SET Name = '" + product.ProductName + "' WHERE ID='" + operation.Key + "'";
            }
    
            int result = command.ExecuteNonQuery();
    
            OperationResult operationResult = new OperationResult(operation,  OperationResult.Status.Success);
    
            if (result < 1){
                operationResult.DSOperationStatus = OperationResult.Status.Failure;
            }
          return operationResult;
        }
    
      public OperationResult[] WriteToDataSource(WriteOperation[] operations)
        {
            OperationResult[] operationResult = new OperationResult[operations.Length];
    
            SqlCommand command = new SqlCommand();
            command.Connection = _connection;
    
            int counter = 0;
    
            foreach (WriteOperation operation in operations){
                Product product = (Product)operation.ProviderCacheItem.Value;
    
                if (operation.OperationType == WriteOperationType.Add){
                  command.CommandText = "INSERT INTO Products(ID,Name)VALUES( '" + operation.Key + "','" + product.ProductName + "')";
                }
    
                if (operation.OperationType == WriteOperationType.Delete){
                      command.CommandText = "DELETE FROM Products WHERE ID ='" + operation.Key + "'";
                }
    
                if (operation.OperationType == WriteOperationType.Update){
                      command.CommandText = "UPDATE Products SET Name = '" + product.ProductName + "' WHERE ID='" + operation.Key + "'";
                }
    
                int result = command.ExecuteNonQuery();
    
                operationResult[counter] = new OperationResult(operation, OperationResult.Status.Success);
    
                if (result < 1){
                    operationResult[counter].DSOperationStatus = OperationResult.Status.Failure;
                }
    
                counter++;
            }
            return operationResult;
        }
    }
    

    Back to top Copyright © 2017 Alachisoft