PS: I just had a look, and I doubt there's any chance of a race condition here... there's only two usages of hasKey(). One is thread local, and the other uses a read/write lock scope.
That said, I think your point about performance is perfectly warranted, and quite simple to solve. For example: if (cache.hasKey(key)) { return (List) cache.getObject(key); }... Becomes: Object value = cache.getObject(key) if (value != null) { return Cache.isNull(value) ? null : value; }... Where Cache.isNull(value) simply checks if value == Cache.NULL_OBJECT. Of course you could just do that outside too, but I think having a method like this makes it nicer to read. Do you want to add a Jira ticket for this? Clinton On Thu, Dec 31, 2009 at 9:04 AM, Clinton Begin <clinton.be...@gmail.com>wrote: > Good points. > > I think the only reason hasKey exists is to support cached null values. > But that said, I believe in iBATIS 2 I used a NULL_OBJECT value to represent > the difference between "yes I'm cached, and I'm null" vs. "I'm not cached". > > So I think there definitely is something to look at here. > > Clinton > > > On Thu, Dec 31, 2009 at 5:38 AM, Simone Tripodi > <simone.trip...@gmail.com>wrote: > >> Hi all guys, >> since I've been integrating 3rd part caching solutions[1] in iBatis3, >> I started thinking about the use of method in the Cache interface: >> >> org.apache.ibatis.cache.Cache#hasKey() >> >> Honestly, I'm a little scared about the use for a key check, as it may >> expire between checking for the key, and whatever you want to do with >> the stored object, and produce a race condition :( >> I'd propose to remove this method, and let to the layer built on top >> of cache interface checking if the retrieved object is not null. >> >> Indeed, some distribuited and scalable caching servers like >> memcached[2] don't provide methods to key checking, because of the >> reason above. Moreover, in this scenario, the only way I have to check >> if a key is present in the cache, is getting the object, and checking >> it is null. But let's suppose I've a cached Object of 10M size, >> checking first and then getting if present, causes 20M net traffic :( >> >> Please don't get me wrong, I don't want to criticize the excellent >> work you've been doing - I don't use different persistence layer than >> iBatis! - but since iBatis is largely used in production environments, >> I would encourage the community to be sensible to this kind of >> potential issues. >> >> What do you think about it? Have a nice end of the year party and see >> you next year! :D >> Best regards, >> Simone Tripodi >> >> [1] http://ibaguice.googlecode.com/svn/site/1.0-SNAPSHOT/caching.html >> [2] http://memcached.org/ >> >> -- >> http://www.google.com/profiles/simone.tripodi >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org >> For additional commands, e-mail: user-java-h...@ibatis.apache.org >> >> >