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.
>>>>>>>
>>>>>>>             }
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to