On Wed, May 4, 2011 at 5:09 PM, Pete Muir <pm...@redhat.com> wrote:
>
> On 4 May 2011, at 05:34, Dan Berindei wrote:
>
>> On Wed, May 4, 2011 at 10:14 AM, Galder Zamarreño <gal...@redhat.com> wrote:
>>>
>>> On May 3, 2011, at 2:33 PM, Sanne Grinovero wrote:
>>>
>>>> 2011/5/3 "이희승 (Trustin Lee)" <trus...@gmail.com>:
>>>>> On 05/03/2011 05:08 AM, Sanne Grinovero wrote:
>>>>>> 2011/5/2 Manik Surtani <ma...@jboss.org>:
>>>>>>>
>>>>>>> On 1 May 2011, at 13:38, Pete Muir wrote:
>>>>>>>
>>>>>>>>>> As in, user API?  That's a little intrusive... e.g., put(K, V, cl) ?
>>>>>>>>>
>>>>>>>>> Not for put, since you have the class, just get, and I was thinking
>>>>>>>>> something more like:
>>>>>>>>>
>>>>>>>>> Foo foo = getUsing(key, Foo.class)
>>>>>>>>
>>>>>>>> This would be a pretty useful addition to the API anyway to avoid user 
>>>>>>>> casts.
>>>>>>>
>>>>>>> Maybe as an "advanced" API, so as not to pollute the basic API?  A bit 
>>>>>>> like:
>>>>>>>
>>>>>>> Foo f = cache.getAdvancedCache().asClass(Foo.class).get(key);
>>>>>>
>>>>>> doesn't look much better than a cast, but is more cryptical :)
>>>>>>
>>>>>> getting back to the classloader issue, what about:
>>>>>>
>>>>>> Cache c = cacheManager.getCache( cacheName, classLoader );
>>>>>>
>>>>>> or
>>>>>> Cache c = cacheManager.getCache( cacheName 
>>>>>> ).usingClassLoader(classLoader );
>>>>>>
>>>>>> BTW if that's an issue on the API, maybe you should propose it to
>>>>>> JSR-107 as well ?
>>>>>
>>>>> We have a configurable Marshaller, right?  Then why don't we just use
>>>>> the class loader that the current Marshaller uses?
>>>>
>>>> +1
>>>> I like the clean approach, not sure how you configure the "current
>>>> Marshaller" to use the correct CL ?
>>>> Likely hard to do via configuration file :)
>>>
>>> Well, the marshaller is a global component and so it's a cache manager 
>>> level. You can't make any assumptions about it's classloader, particularly 
>>> when lazy deserialization is configured and you want to make sure that the 
>>> data of the cache is deserialized with the correct classloader when the 
>>> user reads the data from the cache. This is gonna become even more 
>>> important when we for example move to having a single cache for all 2LC 
>>> entities or all EJB3 SFSBs where we'll definitely need multiple 
>>> classloaders to access a single cache.
>>>
>>
>> The current unmarshaller uses the TCCL, which is a great idea for
>> non-modular environments and will still work in AS7 for application
>> classes (so it's still a good default). It probably won't work if
>> Hibernate wants to store its own classes in the cache, because
>> Hibernate's internal classes may not be reachable from the
>> application's classloader.
>>
>> It gets even trickier if Hibernate wants to store a
>> PrivateHibernateCollection class in the cache containing instances of
>> application classes inside. Then I don't think there will be any
>> single classloader that could reach both the Hibernate classes and the
>> application classes so it can properly unmarshal both. Perhaps that's
>> just something for the Hibernate folks to worry about? Or maybe we
>> should allow the users to register more than one classloader with a
>> cache?
>
> You need to use a bridge classloader in this case.

You're right of course, Hibernate must have received/guessed the
application's classloader and so it is able to create a bridge
classloader that "includes" both.

And if the application classes include references to classes from
another module(s), the application has to provide a bridge classloader
to Hibernate anyway.

_______________________________________________
infinispan-dev mailing list
infinispan-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/infinispan-dev

Reply via email to