> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
>>>> 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 <[email protected]> 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.
>>>>>>
>>>>>> }
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>