You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ignite.apache.org by Chetan D <cc...@gmail.com> on 2017/06/07 08:41:21 UTC

update existing cache

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.

            }

Re: update existing cache

Posted by Pavel Tupitsyn <pt...@apache.org>.
Make sure that ICache and ICacheStore generic types match, looks like you
have List<car> in cache but ICacheStore<int, car>

Pavel


On Thu, Jun 8, 2017 at 9:31 AM, Chetan D <cc...@gmail.com> wrote:

> yes i tried with try catch and the same message i got.
>
> 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.Unmana
> ged.UnmanagedCallbacks.CacheStoreInvoke(Int64 memPtr)
>             InnerException:
>
> On Wed, Jun 7, 2017 at 10:01 PM, Pavel Tupitsyn <pt...@apache.org>
> wrote:
>
>> That is strange, can you wrap it in try-catch block and print out
>> ex.ToString()?
>> How many nodes do you have?
>>
>> On Wed, Jun 7, 2017 at 5:46 PM, Chetan D <cc...@gmail.com> wrote:
>>
>>> Hi Pavel,
>>>
>>> That is the full stack trace
>>>
>>> On Jun 7, 2017 7:00 PM, "Pavel Tupitsyn" <pt...@apache.org> wrote:
>>>
>>>> Hi Chetan, is that full stack trace?
>>>>
>>>> Pavel
>>>>
>>>> On Wed, Jun 7, 2017 at 4:20 PM, Chetan D <cc...@gmail.com> wrote:
>>>>
>>>>> 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.Unmana
>>>>> ged.UnmanagedCallbacks.CacheStoreInvoke(Int64 memPtr)
>>>>>             InnerException:
>>>>>
>>>>>
>>>>> On Wed, Jun 7, 2017 at 5:33 PM, Pavel Tupitsyn <pt...@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 <cc...@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 <cc...@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 <cc...@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.Hosting
>>>>>>>>> Process.HostProc.RunUsersAssembly()
>>>>>>>>>        at System.Threading.ThreadHelper.ThreadStart_Context(Object
>>>>>>>>> state)
>>>>>>>>>        at System.Threading.ExecutionCont
>>>>>>>>> ext.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 <cc...@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 <
>>>>>>>>>> ptupitsyn@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 <cc...@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.
>>>>>>>>>>>>
>>>>>>>>>>>>             }
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>
>

Re: update existing cache

Posted by Chetan D <cc...@gmail.com>.
yes i tried with try catch and the same message i got.

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 10:01 PM, Pavel Tupitsyn <pt...@apache.org>
wrote:

> That is strange, can you wrap it in try-catch block and print out
> ex.ToString()?
> How many nodes do you have?
>
> On Wed, Jun 7, 2017 at 5:46 PM, Chetan D <cc...@gmail.com> wrote:
>
>> Hi Pavel,
>>
>> That is the full stack trace
>>
>> On Jun 7, 2017 7:00 PM, "Pavel Tupitsyn" <pt...@apache.org> wrote:
>>
>>> Hi Chetan, is that full stack trace?
>>>
>>> Pavel
>>>
>>> On Wed, Jun 7, 2017 at 4:20 PM, Chetan D <cc...@gmail.com> wrote:
>>>
>>>> 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.Unmana
>>>> ged.UnmanagedCallbacks.CacheStoreInvoke(Int64 memPtr)
>>>>             InnerException:
>>>>
>>>>
>>>> On Wed, Jun 7, 2017 at 5:33 PM, Pavel Tupitsyn <pt...@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 <cc...@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 <cc...@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 <cc...@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.Hosting
>>>>>>>> Process.HostProc.RunUsersAssembly()
>>>>>>>>        at System.Threading.ThreadHelper.ThreadStart_Context(Object
>>>>>>>> state)
>>>>>>>>        at System.Threading.ExecutionCont
>>>>>>>> ext.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 <cc...@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 <
>>>>>>>>> ptupitsyn@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 <cc...@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.
>>>>>>>>>>>
>>>>>>>>>>>             }
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>

Re: update existing cache

Posted by Pavel Tupitsyn <pt...@apache.org>.
That is strange, can you wrap it in try-catch block and print out
ex.ToString()?
How many nodes do you have?

On Wed, Jun 7, 2017 at 5:46 PM, Chetan D <cc...@gmail.com> wrote:

> Hi Pavel,
>
> That is the full stack trace
>
> On Jun 7, 2017 7:00 PM, "Pavel Tupitsyn" <pt...@apache.org> wrote:
>
>> Hi Chetan, is that full stack trace?
>>
>> Pavel
>>
>> On Wed, Jun 7, 2017 at 4:20 PM, Chetan D <cc...@gmail.com> wrote:
>>
>>> 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.Unmana
>>> ged.UnmanagedCallbacks.CacheStoreInvoke(Int64 memPtr)
>>>             InnerException:
>>>
>>>
>>> On Wed, Jun 7, 2017 at 5:33 PM, Pavel Tupitsyn <pt...@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 <cc...@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 <cc...@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 <cc...@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.Hosting
>>>>>>> Process.HostProc.RunUsersAssembly()
>>>>>>>        at System.Threading.ThreadHelper.ThreadStart_Context(Object
>>>>>>> state)
>>>>>>>        at System.Threading.ExecutionCont
>>>>>>> ext.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 <cc...@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 <
>>>>>>>> ptupitsyn@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 <cc...@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.
>>>>>>>>>>
>>>>>>>>>>             }
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>

Re: update existing cache

Posted by Chetan D <cc...@gmail.com>.
Hi Pavel,

That is the full stack trace

On Jun 7, 2017 7:00 PM, "Pavel Tupitsyn" <pt...@apache.org> wrote:

> Hi Chetan, is that full stack trace?
>
> Pavel
>
> On Wed, Jun 7, 2017 at 4:20 PM, Chetan D <cc...@gmail.com> wrote:
>
>> 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.Unmana
>> ged.UnmanagedCallbacks.CacheStoreInvoke(Int64 memPtr)
>>             InnerException:
>>
>>
>> On Wed, Jun 7, 2017 at 5:33 PM, Pavel Tupitsyn <pt...@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 <cc...@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 <cc...@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 <cc...@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.Hosting
>>>>>> Process.HostProc.RunUsersAssembly()
>>>>>>        at System.Threading.ThreadHelper.ThreadStart_Context(Object
>>>>>> state)
>>>>>>        at System.Threading.ExecutionCont
>>>>>> ext.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 <cc...@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 <ptupitsyn@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 <cc...@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.
>>>>>>>>>
>>>>>>>>>             }
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: update existing cache

Posted by Pavel Tupitsyn <pt...@apache.org>.
Hi Chetan, is that full stack trace?

Pavel

On Wed, Jun 7, 2017 at 4:20 PM, Chetan D <cc...@gmail.com> wrote:

> 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 <pt...@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 <cc...@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 <cc...@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 <cc...@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 <cc...@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 <pt...@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 <cc...@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.
>>>>>>>>
>>>>>>>>             }
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: update existing cache

Posted by Chetan D <cc...@gmail.com>.
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 <pt...@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 <cc...@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 <cc...@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 <cc...@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 <cc...@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 <pt...@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 <cc...@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.
>>>>>>>
>>>>>>>             }
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: update existing cache

Posted by Pavel Tupitsyn <pt...@apache.org>.
> 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 <cc...@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 <cc...@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 <cc...@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 <cc...@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 <pt...@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 <cc...@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.
>>>>>>
>>>>>>             }
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>

Re: update existing cache

Posted by Chetan D <cc...@gmail.com>.
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 <cc...@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 <cc...@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 <cc...@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 <pt...@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 <cc...@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.
>>>>>
>>>>>             }
>>>>>
>>>>
>>>>
>>>
>>
>

Re: update existing cache

Posted by Chetan D <cc...@gmail.com>.
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.processors.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.RunUsersAssembly()
       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.Unmanaged.UnmanagedCallbacks.CacheStoreInvoke(Int64
memPtr)
       InnerException:


On Wed, Jun 7, 2017 at 3:08 PM, Chetan D <cc...@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 <pt...@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 <cc...@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.
>>>
>>>             }
>>>
>>
>>
>

Re: update existing cache

Posted by Chetan D <cc...@gmail.com>.
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 <pt...@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 <cc...@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.
>>
>>             }
>>
>
>

Re: update existing cache

Posted by Pavel Tupitsyn <pt...@apache.org>.
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 <cc...@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.
>
>             }
>