public SqlDataManager( Logger logger, GrainStateMap grainStateMap, string connectionString, string shardCredentials, string mapName, BatchingOptions batchingOptions =null) { Logger = logger; Guard.NotNullOrEmpty(connectionString, "conectionString"); Guard.NotNullOrEmpty(shardCredentials, "shardCredentials"); Guard.NotNullOrEmpty(mapName, "mapName"); // Try to get a reference to the Shard Map Manager via the Shard Map Manager database. // If it doesn't already exist, then fail var shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager(connectionString, ShardMapManagerLoadPolicy.Lazy); var shardMap = (RangeShardMap<int>)shardMapManager.GetShardMap(mapName); var shardBatchers = new ConcurrentDictionary<Range<int>, ShardBatcher>(); foreach (var rangeMapping in shardMap.GetMappings()) { Range<int> range = rangeMapping.Value; shardBatchers.TryAdd(range, new ShardBatcher(logger, grainStateMap, rangeMapping.Shard, shardCredentials, batchingOptions)); } _shardBatchers = shardBatchers; _shardMap = shardMap; }
private void Upsert10KStates(string mapName, int count, BatchingOptions batchingOptions) { //InstrumentationContext.Reset(); GrainStateMap grainStateMap = CreateGrainStateMap(); using (var dataManager = new SqlDataManager(logger, grainStateMap, ConnectionString, ShardCredentials, mapName, batchingOptions)) { Stopwatch stopwatch = Stopwatch.StartNew(); List <Task> tasks = new List <Task>(); for (int i = 0; i < count; ++i) { var state = CreateState(i); tasks.Add(dataManager.UpsertStateAsync(RandomIdentity(), state)); } Task.WaitAll(tasks.ToArray()); stopwatch.Stop(); Console.WriteLine(" [{0}] {1} Upserts. {2} max concurrent writes. Elapsed: {3}", mapName, count, batchingOptions.MaxConcurrentWrites, stopwatch.Elapsed); } }
public GrainStateMap CreateGrainStateMap() { var jsonSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; GrainStateMap gsm = new GrainStateMap(); gsm .Register<CustomerGrain>( (cmd, dt) => { cmd.CommandText = @"SELECT G.GrainKey, CustomerId, FirstName, LastName, NickName, BirthDate, Gender, Country, AvatarUrl, KudoPoints, Status, LastLogin, Devices " + @"FROM dbo.CustomerGrains AS G JOIN @List as L "+ @"ON G.GrainKey = L.GrainKey "; var p = cmd.Parameters.AddWithValue("@List", dt); p.SqlDbType = SqlDbType.Structured; p.TypeName = "dbo.GrainKeyListType"; // ? }, reader => { var devices = reader["Devices"]; if (devices is DBNull) devices = string.Empty; return new Dictionary<string, object>() { {"CustomerId", reader["CustomerId"]}, {"FirstName", reader["FirstName"]}, {"LastName", reader["LastName"]}, {"NickName", reader["NickName"]}, {"BirthDate", reader["BirthDate"]}, {"Gender", reader["Gender"]}, {"Country", reader["Country"]}, {"AvatarUrl", reader["AvatarUrl"]}, {"KudoPoints", reader["KudoPoints"]}, {"Status", reader["Status"]}, {"LastLogin", reader["LastLogin"]}, {"Devices", JsonConvert.DeserializeObject((string)devices, jsonSettings)}, }; }, entries => { DataTable data = new DataTable(); data.Columns.Add("GrainKey", typeof(string)); data.Columns.Add("CustomerId", typeof(int)); data.Columns.Add("FirstName", typeof(string)); data.Columns.Add("LastName", typeof(string)); data.Columns.Add("NickName", typeof(string)); data.Columns.Add("BirthDate", typeof(DateTime)); data.Columns.Add("Gender", typeof(int)); data.Columns.Add("Country", typeof(string)); data.Columns.Add("AvatarUrl", typeof(string)); data.Columns.Add("KudoPoints", typeof(int)); data.Columns.Add("Status", typeof(int)); data.Columns.Add("LastLogin", typeof(DateTime)); data.Columns.Add("Devices", typeof(string)); foreach (var entry in entries) { data.Rows.Add( entry.GrainIdentity.GrainKey, entry.State["CustomerId"], entry.State["FirstName"], entry.State["LastName"], entry.State["NickName"], entry.State["BirthDate"], entry.State["Gender"], entry.State["Country"], entry.State["AvatarUrl"], entry.State["KudoPoints"], entry.State["Status"], entry.State["LastLogin"], JsonConvert.SerializeObject(entry.State["Devices"], jsonSettings) ); } return data; }, (cmd, dt) => { cmd.CommandText = @"Upsert_CustomerGrains"; cmd.CommandType = CommandType.StoredProcedure; var p = cmd.Parameters.AddWithValue("@List", dt); p.SqlDbType = SqlDbType.Structured; p.TypeName = "dbo.CustomerGrainsType"; } ); return gsm; }
public GrainStateMap CreateGrainStateMap() { var jsonSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; GrainStateMap gsm = new GrainStateMap(); gsm .Register <CustomerGrain>( (cmd, dt) => { cmd.CommandText = @"SELECT G.GrainKey, CustomerId, FirstName, LastName, NickName, BirthDate, Gender, Country, AvatarUrl, KudoPoints, Status, LastLogin, Devices " + @"FROM dbo.CustomerGrains AS G JOIN @List as L " + @"ON G.GrainKey = L.GrainKey "; var p = cmd.Parameters.AddWithValue("@List", dt); p.SqlDbType = SqlDbType.Structured; p.TypeName = "dbo.GrainKeyListType"; // ? }, reader => { var devices = reader["Devices"]; if (devices is DBNull) { devices = string.Empty; } return(new { CustomerId = reader["CustomerId"], FirstName = reader["FirstName"], LastName = reader["LastName"], NickName = reader["NickName"], BirthDate = reader["BirthDate"], Gender = reader["Gender"], Country = reader["Country"], AvatarUrl = reader["AvatarUrl"], KudoPoints = reader["KudoPoints"], Status = reader["Status"], LastLogin = reader["LastLogin"], Devices = JsonConvert.DeserializeObject((string)devices, jsonSettings) }); }, entries => { DataTable data = new DataTable(); data.Columns.Add("GrainKey", typeof(string)); data.Columns.Add("CustomerId", typeof(int)); data.Columns.Add("FirstName", typeof(string)); data.Columns.Add("LastName", typeof(string)); data.Columns.Add("NickName", typeof(string)); data.Columns.Add("BirthDate", typeof(DateTime)); data.Columns.Add("Gender", typeof(int)); data.Columns.Add("Country", typeof(string)); data.Columns.Add("AvatarUrl", typeof(string)); data.Columns.Add("KudoPoints", typeof(int)); data.Columns.Add("Status", typeof(int)); data.Columns.Add("LastLogin", typeof(DateTime)); data.Columns.Add("Devices", typeof(string)); foreach (var entry in entries) { data.Rows.Add(entry.GrainIdentity.GrainKey, JsonConvert.SerializeObject(entry.State, jsonSettings)); } return(data); }, (cmd, dt) => { cmd.CommandText = @"Upsert_CustomerGrains"; cmd.CommandType = CommandType.StoredProcedure; var p = cmd.Parameters.AddWithValue("@List", dt); p.SqlDbType = SqlDbType.Structured; p.TypeName = "dbo.CustomerGrainsType"; } ); return(gsm); }