AWS Developer Tools Blog
DynamoDB Table Cache
Version 3 of the AWS SDK for .NET includes a new feature, the SDK Cache. This is an in-memory cache used by the SDK to store information like DynamoDB table descriptions. Before version 3, the SDK retrieved table information when you constructed a Table
or DynamoDBContext
object. For example, the following code creates a table and performs several operations on it. The LoadTable
method makes a DescribeTable
call to DynamoDB, so this sample will make three service calls: DescribeTable
, GetItem
, and UpdateItem
.
var table = Table.LoadTable(ddbClient, "TestTable");
var item = table.GetItem(42);
item["Updated"] = DateTime.Now;
table.UpdateItem(item);
In most cases, your application will use tables that do not change, so constantly retrieving the same table information is wasteful and unnecessary. In fact, to keep the number of service calls to a minimum, the best option is to create a single copy of the Table
or DynamoDBContext
object and keep it around for the lifetime of your application. This, of course, requires a change to the way your application uses the AWS SDK for .NET.
We will now attempt to retrieve table information from the SDK Cache. Even if your code is constructing a new Table
or DynamoDBContext
object for each call, the SDK will only make a single DescribeTable
call per table, and will keep this data around for the lifetime of the process. So if you ran the preceding code twice, only the first invocation of LoadTable would result in a DescribeTable
call.
This change will reduce the number of DescribeTable
calls your application makes, but in some cases you may need to get the most up-to-date table information from the service (for example, if you are developing a generic DynamoDB table scanner utility). You have two options: periodically clear the table metadata cache or disable the SDK Cache.
The first approach is to call Table.ClearTableCache()
, a static method on the Table
class. This operation will clear out the entire table metadata cache, so any Table
or DynamoDBContext
objects you create after this point will result in one new DescribeTable
call per table. (Of course, after the data is retrieved once, it will again be stored in the cache. This approach will work only if you know when your table metadata changes and clear the cache intermittently.)
The second approach is to disable the SDK Cache, forcing the SDK to always retrieve the current table configuration. This can be accomplished through code or the app.config/web.config file, as illustrated below. (Disabling the SDK Cache will revert to version 2 behavior, so unless you hold on to the Table
or DynamoDBContext
objects as you create them, your application will end up making DescribeTable
service calls.)
Disabling the cache through code:
// Disable SDK Cache for the entire application
AWSConfigs.UseSdkCache = false;
Disabling the cache through app.config:
<configuration>
<appSettings>
<!-- Disables SDK Cache for the entire application -->
<add key="AWSCache" value="false" />
</appSettings>
</configuration>