That sounds much more straight-forward an easier to understand. :)

/Oskar


Den tors 29 nov. 2018 kl 20:46 skrev Gökhan Abatay <gokhanaba...@gmail.com>:

> Hi Oskar Berggren,
> Thank you for quick response, actually I change my perspective after
> posing this message now I have the same idea with you.
> I change my flow producer thread just select unique id and passes to
> worker consumer threads.
> Then consumer threads just selects what they need to implement their
> business.
> Everything works like charm.
>
>     public class ConsumerProducerBatch : BaseBatch<long>
>     {
>         [UnitOfWork]
>         protected override void Consume(params List<long>[] pagedItems)
>         {
>             List<EodJobRunLog> runLogs = new List<EodJobRunLog>();
>             foreach (var items in pagedItems)
>             {
>                 var result = ISession.Query<EodJobRunLog>()
>                                      .Where(x => items.Contains(x.Guid))
>                                      .ToList();
>                 runLogs.AddRange(result);
>             }
>
>             foreach (var item in runLogs)
>             {
>                 if (item.MemberDefinition.IsAdmin == true)
>                 {
>                     item.ErrorCode = "000001";
>                     ISession.Update(item);
>                 }
>             }
>         }
>
>         [UnitOfWork]
>         protected override IQueryable<long> Produce()
>         {
>             return ISession.Query<EodJobRunLog>().Select(x=>x.Guid);
>         }
>     }
>
>
>
> On Thursday, November 29, 2018 at 9:26:16 PM UTC+3, Oskar Berggren wrote:
>>
>> I looks to me like you are accessing a bunch of interfaces that are not
>> necessarily the official way to work with NHibernate. The ISession provides
>> the interface to reattach objects.
>>
>> Personally I've always found Evict/Attach messy, to be honest.
>>
>> You mention that you need very good performance. I'm not convinced that
>> shifting loaded entities between threads and sessions using evict/attach is
>> the best way to achieve that. Have you explored having multiple threads
>> just reading from the database themselves?
>>
>> /Oskar
>>
>>
>> Den tors 29 nov. 2018 kl 18:03 skrev Gökhan Abatay <gokhan...@gmail.com>:
>>
>>> I try to implement Consumer(Multiple Thread), Producer(Single Thread
>>> that is main one) architecture;
>>> Producer thread owns it' NH session and retrieves data and if it' fetch
>>> enough to process(limited by parameter like 500 record) send to Consumer
>>> thread (consumer owns another session) to process them.
>>>
>>> While Consumer and producer sessions both active at the same time, to
>>> process the records I need to "Session.Evict(x)" for all records.
>>>
>>> To access oldState for logging at Post Events I need to Consumer thread
>>> session attach the records with below code without access to second level
>>> cache nor database.
>>>
>>> public static T Attach<T>(this ISession session, T entity)
>>>         {
>>>             ISessionImplementor sessionImplementor = 
>>> session.GetSessionImplementation();
>>>             IEntityPersister persister = 
>>> sessionImplementor.GetEntityPersister(NHibernateProxyHelper.GuessClass(entity).FullName,
>>>  entity);
>>>             Object[] loadedState = persister.GetPropertyValues(entity);
>>>             Object id = persister.GetIdentifier(entity);
>>>             EntityEntry entry = 
>>> sessionImplementor.PersistenceContext.AddEntry(entity, Status.Loaded, 
>>> loadedState, null, id, null, LockMode.None, true, persister, true, true);
>>>             return entity;
>>>         }
>>>
>>> Everything is fine but proxy objects stores "_session" in private
>>> variables and it's null because I evicted by retrieval session.
>>>
>>> How to set "_session" variable in proxy classes at entity level, is
>>> there any function to do that.
>>> If I use reflection to get Proxy Properties I am afraid for bad
>>> performance and it needed to be recursive.
>>> If I can get entity owned proxy properties with recursive I can call
>>> ILazyInitializer.SetSession?
>>>
>>> Am I doing something wrong because I need very good performance using
>>> parallel threads.
>>>
>>> NHibernate.Proxy.AbstractLazyInitializer.Initialize() in 
>>> C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Proxy\AbstractLazyInitializer.cs:line
>>>  115
>>>    at NHibernate.Proxy.AbstractLazyInitializer.GetImplementation() in 
>>> C:\nhibernate-master\nhibernate-core-master\src\NHibernate\Proxy\AbstractLazyInitializer.cs:line
>>>  191
>>>    at MemberDefinitionProxy.get_IsAdmin()
>>>    at Framework.Batch.Eod.ConsumerProducerBatch.Consume(List`1 items) in 
>>> D:\Framework.Batch\Eod\SampleEodBatch.cs:line 85
>>>    at 
>>> Framework.Facilities.Batch.BaseBatch`1.<>c__DisplayClass26_0.<RunConsume>b__1()
>>>  in D:\Framework.Facilities.Batch\BaseBatch.cs:line 289
>>>    at Framework.Facilities.Batch.BaseBatch.Handle(UnitOfWorkAttribute 
>>> unitOfWork, Action T0, Action T1, Action T2) in 
>>> D:\Framework.Facilities.Batch\BaseBatch.cs:line 54
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "nhusers" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to nhusers+u...@googlegroups.com.
>>> To post to this group, send email to nhu...@googlegroups.com.
>>> Visit this group at https://groups.google.com/group/nhusers.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "nhusers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to nhusers+unsubscr...@googlegroups.com.
> To post to this group, send email to nhusers@googlegroups.com.
> Visit this group at https://groups.google.com/group/nhusers.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to nhusers+unsubscr...@googlegroups.com.
To post to this group, send email to nhusers@googlegroups.com.
Visit this group at https://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to