> my requirement is such that i need to store all values of table with
single key associated
How many values do you plan to store in a single Ignite entry?
Typically you have one Ignite cache entry for one DB row.

>  when a new record has been added and that new record i need to insert it
to cache
So you in Ignite you have a mapping from int to List<Car>, right?
ICache<int, List<Car>>?
If you need to insert a new Car into that list atomically, you can do that
within a cache lock:

using (var cacheLock = cache.Lock(1))
{
    cacheLock.Enter();
    List<Car> cars = cache.Get(1);
    cars.Add(newCar);
    cache.Put(1, cars);
    cacheLock.Exit();
}

> difference between cache.getandreplace() and cache.getandput()
GetAndReplace does not do anything if there is no entry with specified key.
GetAndPut always has effect: either creates new entry or updates existing

  cache.GetAndReplace(1, "");
  cache.ContainsKey(1); // False
  cache.GetAndPut(2, "");
  cache.ContainsKey(2); // True


> Unable to cast object of type
'System.Collections.Generic.List`1[Addtableentirely.car]' to type
'Addtableentirely.car'
Your cache store implementation is ICacheStore<int, car> while there is
List<car> value in cache.
Change the cache store to ICacheStore<int, List<car>>

>  the issue is when i do the above code it is again actually calling my
icachestore method WRITE() and the data is again added to database table
To avoid this use WithSkipStore method:
cache.WithSkipStore().Put(e.Entity.ID,new car(e.Entity.Name,
e.Entity.Power));

Here you have ICache<int, car> again instead of List<car>, by the way. Have
you decided to go this way instead?


> $bin/ignite.sh but its not working
For .NET please use
platforms\dotnet\bin\Apache.Ignite.exe


Thanks,

Pavel

On Wed, Jun 7, 2017 at 2:08 PM, Chetan D <ccheta...@gmail.com> wrote:

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

Reply via email to