> my requirement is such that i need to store all values of table with single key associated How many values do you plan to store in a single Ignite entry? Typically you have one Ignite cache entry for one DB row.
> when a new record has been added and that new record i need to insert it to cache So you in Ignite you have a mapping from int to List<Car>, right? ICache<int, List<Car>>? If you need to insert a new Car into that list atomically, you can do that within a cache lock: using (var cacheLock = cache.Lock(1)) { cacheLock.Enter(); List<Car> cars = cache.Get(1); cars.Add(newCar); cache.Put(1, cars); cacheLock.Exit(); } > difference between cache.getandreplace() and cache.getandput() GetAndReplace does not do anything if there is no entry with specified key. GetAndPut always has effect: either creates new entry or updates existing cache.GetAndReplace(1, ""); cache.ContainsKey(1); // False cache.GetAndPut(2, ""); cache.ContainsKey(2); // True > Unable to cast object of type 'System.Collections.Generic.List`1[Addtableentirely.car]' to type 'Addtableentirely.car' Your cache store implementation is ICacheStore<int, car> while there is List<car> value in cache. Change the cache store to ICacheStore<int, List<car>> > the issue is when i do the above code it is again actually calling my icachestore method WRITE() and the data is again added to database table To avoid this use WithSkipStore method: cache.WithSkipStore().Put(e.Entity.ID,new car(e.Entity.Name, e.Entity.Power)); Here you have ICache<int, car> again instead of List<car>, by the way. Have you decided to go this way instead? > $bin/ignite.sh but its not working For .NET please use platforms\dotnet\bin\Apache.Ignite.exe Thanks, Pavel On Wed, Jun 7, 2017 at 2:08 PM, Chetan D <ccheta...@gmail.com> wrote: > Hi, > > I need one more help can you tell me how to start ignite node without > using Visual studio. > > i have seen this command > > $bin/ignite.sh > > but its not working > > > > On Wed, Jun 7, 2017 at 4:29 PM, Chetan D <ccheta...@gmail.com> wrote: > >> Hi Pavel, >> >> when a new record has been added to DB i have handled it through event >> and i was able to add it to cache >> like this >> var ignite = Ignition.GetIgnite(); >> var cache = ignite.GetCache<int, car>("cars"); >> cache.Put(e.Entity.ID,new car(e.Entity.Name, >> e.Entity.Power)); >> >> but the issue is when i do the above code it is again actually calling my >> icachestore method WRITE() and the data is again added to database table. >> >> On Wed, Jun 7, 2017 at 3:13 PM, Chetan D <ccheta...@gmail.com> wrote: >> >>> also i am doing this and got the following error dont know what it is. >>> >>> SqlCommand cmd = new SqlCommand("select Name,Power from Cars", con); >>> con.Open(); >>> rdr = cmd.ExecuteReader(); >>> >>> #region using put >>> List<car> directcar = new List<car>(); >>> while (rdr.Read()) >>> { >>> directcar.Add(new car(rdr["Name"].ToString(), >>> Convert.ToDouble(rdr["Power"]))); >>> } >>> cache.Put(2, directcar); >>> >>> got this exception >>> Apache.Ignite.Core.Cache.Store.CacheStoreException was unhandled >>> HResult=-2146233088 >>> Message=class org.apache.ignite.internal.pro >>> cessors.cache.CachePartialUpdateCheckedException: Failed to update keys >>> (retry update if possible).: [2] >>> Source=Apache.Ignite.Core >>> StackTrace: >>> at Apache.Ignite.Core.Impl.PlatformTarget.DoOutInOpX(Int32 type, >>> Action`1 outAction, Func`2 inErrorAction) >>> at Apache.Ignite.Core.Impl.Cache.CacheImpl`2.DoOutOp[T1,T2](CacheOp >>> op, T1 x, T2 y) >>> at Apache.Ignite.Core.Impl.Cache.CacheImpl`2.Put(TK key, TV val) >>> at Addtableentirely.Program.Main(String[] args) in >>> C:\Users\M1029218\Documents\Visual Studio >>> 2015\Projects\Apacheignite\Addtableentirely\Program.cs:line >>> 106 >>> at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, >>> String[] args) >>> at System.AppDomain.ExecuteAssembly(String assemblyFile, >>> Evidence assemblySecurity, String[] args) >>> at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssem >>> bly() >>> at System.Threading.ThreadHelper.ThreadStart_Context(Object >>> state) >>> at System.Threading.ExecutionContext.RunInternal(ExecutionContext >>> executionContext, ContextCallback callback, Object state, Boolean >>> preserveSyncCtx) >>> at System.Threading.ExecutionContext.Run(ExecutionContext >>> executionContext, ContextCallback callback, Object state, Boolean >>> preserveSyncCtx) >>> at System.Threading.ExecutionContext.Run(ExecutionContext >>> executionContext, ContextCallback callback, Object state) >>> at System.Threading.ThreadHelper.ThreadStart() >>> InnerException: >>> HResult=-2147467262 >>> Message=Unable to cast object of type ' >>> System.Collections.Generic.List`1[Addtableentirely.car]' to type >>> 'Addtableentirely.car'. >>> Source=Apache.Ignite.Core >>> StackTrace: >>> at Apache.Ignite.Core.Impl.Binary >>> .BinaryReflectiveSerializerInternal.Apache.Ignite.Core.Impl. >>> Binary.IBinarySerializerInternal.ReadBinary[T](BinaryReader reader, >>> IBinaryTypeDescriptor desc, Int32 pos) >>> at Apache.Ignite.Core.Impl.Binary >>> .BinaryReader.ReadFullObject[T](Int32 pos) >>> at Apache.Ignite.Core.Impl.Binary >>> .BinaryReader.TryDeserialize[T](T& res) >>> at Apache.Ignite.Core.Impl.Binary >>> .BinaryReader.Deserialize[T]() >>> at Apache.Ignite.Core.Impl.Binary >>> .BinaryReader.ReadBinaryObject[T](Boolean doDetach) >>> at Apache.Ignite.Core.Impl.Binary >>> .BinaryReader.TryDeserialize[T](T& res) >>> at Apache.Ignite.Core.Impl.Binary >>> .BinaryReader.Deserialize[T]() >>> at Apache.Ignite.Core.Impl.Binary >>> .BinaryReader.ReadObject[T]() >>> at Apache.Ignite.Core.Impl.Cache. >>> Store.CacheStoreInternal`2.Invoke(IBinaryStream stream, Ignite grid) >>> at Apache.Ignite.Core.Impl.Cache. >>> Store.CacheStore.Invoke(PlatformMemoryStream stream, Ignite grid) >>> at Apache.Ignite.Core.Impl.Unmana >>> ged.UnmanagedCallbacks.CacheStoreInvoke(Int64 memPtr) >>> InnerException: >>> >>> >>> On Wed, Jun 7, 2017 at 3:08 PM, Chetan D <ccheta...@gmail.com> wrote: >>> >>>> Hi Pavel, >>>> >>>> I got that its easy when there is a key with value but my requirement >>>> is such that i need to store all values of table with single key >>>> associated. >>>> >>>> The code which you sent is not working and doesnt give any error as >>>> well. >>>> >>>> you have sent it in case when an update happens. >>>> >>>> my question is when a new record has been added and that new record i >>>> need to insert it to cache. >>>> >>>> and also i have a column in my table in which i have updated say in >>>> this case name value to something else so i need to update that >>>> corresponding value in cache as well. >>>> >>>> >>>> can you tell me the difference between cache.getandreplace() and >>>> cache.getandput() they both are doing same thing actually. >>>> >>>> >>>> >>>> it would be helpfull if i can get answer with respect to list storage. >>>> >>>> On Wed, Jun 7, 2017 at 2:34 PM, Pavel Tupitsyn <ptupit...@apache.org> >>>> wrote: >>>> >>>>> Hi Chetan, >>>>> >>>>> I'm not sure about #1 and #3 - why do you add all entities as a list >>>>> with a single key? Typically this is not how Ignite is used. >>>>> Proper way is to add each entity (Car) as a separate cache entry, with >>>>> unique key (id), like in #2. >>>>> >>>>> As soon as you have all data in cache, each Car with a unique id, and >>>>> you have an SQL listener set up, event handler can look like this: >>>>> >>>>> static void Changed(object sender, RecordChangedEventArgs<Car> e) >>>>> { >>>>> var ignite = Ignition.GetIgnite(); >>>>> var cache = ignite.GetCache<int, Car>("cars"); >>>>> >>>>> switch (e.ChangeType) >>>>> { >>>>> case ChangeType.Update: >>>>> cache.Put(e.ID, e); >>>>> break; >>>>> case ChangeType.Delete: >>>>> cache.Remove(e.ID); >>>>> break; >>>>> } >>>>> } >>>>> >>>>> Let me know if this makes sense. >>>>> >>>>> Thanks, >>>>> Pavel >>>>> >>>>> >>>>> On Wed, Jun 7, 2017 at 11:41 AM, Chetan D <ccheta...@gmail.com> wrote: >>>>> >>>>>> Hi Pavel, >>>>>> >>>>>> I am using the same car program which you have written in blog and i >>>>>> have some doubts on that. >>>>>> >>>>>> I have the following scenarios which i have doubts on. >>>>>> >>>>>> 1.#region using put >>>>>> List<car> directcar = new List<car>(); >>>>>> while (rdr.Read()) >>>>>> { >>>>>> directcar.Add(new car(rdr["Name"].ToString(), >>>>>> Convert.ToDouble(rdr["Power"]))); >>>>>> } >>>>>> cache.Put(1, directcar); >>>>>> #endregion put >>>>>> Here i am creating a cache and adding list of values with a single key >>>>>> >>>>>> 2.Using data streamer >>>>>> //using (var ldr = ignite.GetDataStreamer<int, car>(cacheCfg.Name)) >>>>>> //{ >>>>>> // //ldr.PerNodeBufferSize = 1024; >>>>>> >>>>>> >>>>>> // while (rdr.Read()) >>>>>> // { >>>>>> // ldr.AddData((int)rdr[0], new >>>>>> car(rdr["Name"].ToString(),Convert.ToDouble(rdr["Power"]))); >>>>>> >>>>>> // Console.WriteLine("LDR" + ldr.ToString()); >>>>>> >>>>>> // } >>>>>> >>>>>> //} >>>>>> here i am using datastreamer and adding each values with a key >>>>>> >>>>>> 3. #region adding all elements as list with single key using get >>>>>> datastremer >>>>>> using (var ldr = ignite.GetDataStreamer<int, >>>>>> List<car>>(cacheCfg.Name)) >>>>>> { >>>>>> List<car> cars = new List<car>(); >>>>>> >>>>>> while (rdr.Read()) >>>>>> { >>>>>> cars.Add(new car(rdr["Name"].ToString(), >>>>>> Convert.ToDouble(rdr["Power"]))); >>>>>> } >>>>>> ldr.AddData(1, cars); >>>>>> Console.WriteLine("LDR" + ldr.ToString()); >>>>>> >>>>>> } >>>>>> #region reading from cache >>>>>> foreach (ICacheEntry<int, List<car>> car in cache) >>>>>> { >>>>>> foreach (car cars in car.Value) >>>>>> { >>>>>> Console.WriteLine(cars.ToString()); >>>>>> } >>>>>> Console.WriteLine(car.Value.ToList()); >>>>>> >>>>>> >>>>>> } >>>>>> #endregion >>>>>> here i am using data streamer to add list of values with a single key. >>>>>> >>>>>> so now when this application is running and all the cache data has >>>>>> been loaded i have added a new record in my table. >>>>>> >>>>>> so for that i have added a listener like this >>>>>> >>>>>> var mapper = new ModelToTableMapper<car>(); >>>>>> mapper.AddMapping(c => c.ID, "ID"); >>>>>> mapper.AddMapping(c => c.Name, "Name"); >>>>>> mapper.AddMapping(c => c.Power, "Power"); >>>>>> mapper.AddMapping(c => c.IsAvailable, "IsAvailable"); >>>>>> >>>>>> >>>>>> >>>>>> using (var dep = new >>>>>> SqlTableDependency<car>(ad.sqlconnection, >>>>>> "Cars", mapper)) >>>>>> { >>>>>> dep.OnChanged += Changed; >>>>>> dep.Start(); >>>>>> >>>>>> Console.WriteLine("Press a key to exit"); >>>>>> Console.ReadKey(); >>>>>> >>>>>> dep.Stop(); >>>>>> } >>>>>> #endregion >>>>>> static void Changed(object sender, RecordChangedEventArgs<car> e) >>>>>> { >>>>>> if (e.ChangeType != ChangeType.None) >>>>>> { >>>>>> var changedEntity = e.Entity; >>>>>> Console.WriteLine("DML operation: " + e.ChangeType); >>>>>> Console.WriteLine("ID: " + changedEntity.ID); >>>>>> Console.WriteLine("Name: " + changedEntity.Name); >>>>>> Console.WriteLine("Power: " + changedEntity.Power); >>>>>> Console.WriteLine("IsAvailable: " + >>>>>> changedEntity.IsAvailable); >>>>>> >>>>>> Console.WriteLine("<---------- >>>>>> ------------------------------------------------------------ >>>>>> ---------------->"); >>>>>> } >>>>>> >>>>>> so my question is when a new record has been added to my table i get >>>>>> a event triggered and will get the value which is inserted. >>>>>> >>>>>> so now how to add the new value to existing cache say by using >>>>>> datastreamer which works on list i need to add this row to end of list in >>>>>> existing cache. >>>>>> >>>>>> Delete >>>>>> when record is deleted i get a event and i need to delete that record >>>>>> from existing cache. >>>>>> >>>>>> Update >>>>>> when a column of table is updated say NAME column i need to update >>>>>> that particular column value in cache. >>>>>> >>>>>> can you please help me how to implement this. >>>>>> >>>>>> } >>>>>> >>>>> >>>>> >>>> >>> >> >