smithsson68@gmail.com
Jan 15, 2010
  11849
(7 votes)

Using a DynamicDataStore instance correctly

I’ve recently seen a couple of examples of code where the Dynamic Data Store (being released as part of CMS 6) has been used in a multithreaded environment (web app for example) in a singleton pattern, i.e. a single instance of a DynamicDataStore is shared between all requests (read threads) in the application.

THIS IS BAD!

The default implementation (EPiServerDynamicDataStore) of the DynamicDataStore is not thread safe.

Let me just say that again

DYNAMIC DATA STORE IS NOT THREAD SAFE.

Think of it like an ADO.NET connection object:

- Obtain – Use – Throw Away

on the stack in a method.

The internals of the Dynamic Data Store are thread safe, that is all instances access shared data with thread synchronization. The cost of obtaining a DDS instance using the DynamicDataStoreFactory GetStore method is low due to all store metadata being cached in memory so there really is no need to hold DDS instances as member variables in a class.

An example of the recommended use pattern can be found below:

 

// Create and populate my object
Person p = new Person();
p.FirstName = "Micky";
p.LastName = "Mouse";

// Obtain a store instance
EPiServer.Data.Dynamic.DynamicDataStore store = GetStore(typeof(Person));

// save the object
store.Save(p);

static EPiServer.Data.Dynamic.DynamicDataStore GetStore(Type t)
{
  // GetStore will only return null the first time this method is called for a Type
  // In that case the ?? C# operator will call CreateStore
  return EPiServer.Data.Dynamic.DynamicDataStoreFactory.Instance.GetStore(t) ??
      EPiServer.Data.Dynamic.DynamicDataStoreFactory.Instance.CreateStore(t);
}
Jan 15, 2010

Comments

Jonathan Roberts
Jonathan Roberts Nov 20, 2014 06:28 PM

THis is great - can you get the data from the DDS when using a webservice? for example:

var store = DynamicDataStoreFactory.Instance.GetStore(typeof(CategoryItems));

var responses = from r in store.Items()
select r;

I use the exact code in a page and I get the data back but calling it from a webservice I get Zero items returned.

Jon

Please login to comment.
Latest blogs
The missing globe can finally be installed as a nuget package!

Do you feel like you're dying a little bit every time you need to click "Options" and then "View on Website"? Do you also miss the old "Globe" in...

Tomas Hensrud Gulla | Feb 14, 2025 | Syndicated blog

Cloudflare Edge Logs

Optimizely is introducing the ability to access Cloudflare's edge logs, which gives access to some information previously unavailable except throug...

Bob Davidson | Feb 14, 2025 | Syndicated blog

Comerce Connect calatog caching settings

A critical aspect of Commerce Connect is the caching mechanism for the product catalog, which enhances performance by reducing database load and...

K Khan | Feb 14, 2025

CMP DAM asset sync to Optimizely Graph self service

The CMP DAM integration in CMS introduced support for querying Optimizly Graph (EPiServer.Cms.WelcomeIntegration.Graph 2.0.0) for metadata such as...

Robert Svallin | Feb 13, 2025

PageCriteriaQueryService builder with Blazor and MudBlazor

This might be a stupid idea but my new years resolution was to do / test more stuff so here goes. This razor component allows users to build and...

Per Nergård (MVP) | Feb 10, 2025

Enhancing Optimizely CMS Multi-Site Architecture with Structured Isolation

The main challenge of building an Optimizely CMS website is to think about its multi site capabilities up front. Making adjustment after the fact c...

David Drouin-Prince | Feb 9, 2025 | Syndicated blog