Hi Pavel, I have implemented Lock but got following exception.
using (var cacheLock = cache.Lock(1)) { cacheLock.Enter(); List<Car> cars = cache.Get(1); cars.Add(newCar); cache.Put(1, cars);-------------------------->exception here cacheLock.Exit(); } Apache.Ignite.Core.Cache.Store.CacheStoreException was unhandled by user code HResult=-2146233088 Message=class org.apache.ignite.transactions.TransactionRollbackException: Transaction has been rolled back: 48906b28c51-00000000-0674-db36-0000-000000000001 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.Changed(Object sender, RecordChangedEventArgs`1 e) in C:\Users\M1029218\Documents\Visual Studio 2015\Projects\Apacheignite\Addtableentirely\Program.cs:line 260 InnerException: HResult=-2146233088 Message=Transaction has been rolled back: 48906b28c51-00000000-0674-db36-0000-000000000001 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.Unmanaged.UnmanagedCallbacks.CacheStoreInvoke(Int64 memPtr) InnerException: On Wed, Jun 7, 2017 at 5:33 PM, Pavel Tupitsyn <ptupit...@apache.org> wrote: > > 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. >>>>>>> >>>>>>> } >>>>>>> >>>>>> >>>>>> >>>>> >>>> >>> >> >