示例#1
0
        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;
        }
示例#2
0
        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;
        }
示例#4
0
        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);
        }