From: <one...@us...> - 2003-02-16 01:55:09
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/impl In directory sc8-pr-cvs1:/tmp/cvs-serv7760/hibernate/impl Modified Files: SessionFactoryImpl.java SessionImpl.java Log Message: enable use of JDK IdentityHashMap in 1.4+ Index: SessionFactoryImpl.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/impl/SessionFactoryImpl.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** SessionFactoryImpl.java 15 Feb 2003 08:57:57 -0000 1.10 --- SessionFactoryImpl.java 16 Feb 2003 01:55:05 -0000 1.11 *************** *** 287,296 **** } ! // Emulates constant time LRU/MRU algorythms for cache // It is better to hold strong refernces on some (LRU/MRU) queries private transient final int MAX_STRONG_REF_COUNT = 128; //TODO: configurable? private transient final Object strongRefs[] = new Object[MAX_STRONG_REF_COUNT]; //strong reference to MRU queries private transient int strongRefIndex = 0; ! private transient final Map softQueryCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT) ; private static QueryCacheKeyFactory keyFactory = (QueryCacheKeyFactory) KeyFactory.create( --- 287,297 ---- } ! // Emulates constant time LRU/MRU algorithms for cache // It is better to hold strong refernces on some (LRU/MRU) queries private transient final int MAX_STRONG_REF_COUNT = 128; //TODO: configurable? private transient final Object strongRefs[] = new Object[MAX_STRONG_REF_COUNT]; //strong reference to MRU queries private transient int strongRefIndex = 0; ! private transient final Map softQueryCache = new ReferenceMap(ReferenceMap.SOFT, ReferenceMap.SOFT) ; ! // both keys and values may be soft since value keeps a hard ref to the key (and there is a hard ref to MRU values) private static QueryCacheKeyFactory keyFactory = (QueryCacheKeyFactory) KeyFactory.create( *************** *** 298,302 **** ); ! //retuns generated class instance interface QueryCacheKeyFactory { //Will not recalculate hashKey for constant queries --- 299,303 ---- ); ! //returns generated class instance interface QueryCacheKeyFactory { //Will not recalculate hashKey for constant queries *************** *** 333,338 **** // have to be careful to ensure that if the JVM does out-of-order execution // then another thread can't get an uncompiled QueryTranslator from the cache ! // its a bit of a performance killer since it means no other thread can perform ! // a query while another query is being compiled QueryTranslator q = (QueryTranslator) get(cacheKey); --- 334,339 ---- // have to be careful to ensure that if the JVM does out-of-order execution // then another thread can't get an uncompiled QueryTranslator from the cache ! // we also have to be very careful to ensure that other threads can perform ! // compiled queries while another query is being compiled QueryTranslator q = (QueryTranslator) get(cacheKey); Index: SessionImpl.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/impl/SessionImpl.java,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** SessionImpl.java 15 Feb 2003 01:00:52 -0000 1.20 --- SessionImpl.java 16 Feb 2003 01:55:05 -0000 1.21 *************** *** 83,89 **** private final Map entitiesByKey; //key=Key, value=Object private final Map proxiesByKey; //key=Key, value=HibernateProxy ! private final IdentityMap entries; //key=Object, value=Entry ! private final IdentityMap arrayHolders; //key=array, value=ArrayHolder ! private final IdentityMap collections; //key=PersistentCollection, value=CollectionEntry private Set nullifiables = new HashSet(); //set of Keys of deleted objects --- 83,89 ---- private final Map entitiesByKey; //key=Key, value=Object private final Map proxiesByKey; //key=Key, value=HibernateProxy ! private transient Map entries; //key=Object, value=Entry ! private transient Map arrayHolders; //key=array, value=ArrayHolder ! private transient Map collections; //key=PersistentCollection, value=CollectionEntry private Set nullifiables = new HashSet(); //set of Keys of deleted objects *************** *** 308,311 **** --- 308,314 ---- ois.defaultReadObject(); + entries = IdentityMap.deserialize( ois.readObject() ); + collections = IdentityMap.deserialize( ois.readObject() ); + arrayHolders = IdentityMap.deserialize( ois.readObject() ); initTransientCollections(); *************** *** 359,362 **** --- 362,368 ---- oos.defaultWriteObject(); + oos.writeObject( IdentityMap.serialize(entries) ); + oos.writeObject( IdentityMap.serialize(collections) ); + oos.writeObject( IdentityMap.serialize(arrayHolders) ); } *************** *** 375,382 **** entitiesByKey = new HashMap(50); proxiesByKey = new HashMap(10); ! entries = new IdentityMap(); ! //tableAccesses = new THashSet(10); ! collections = new IdentityMap(); ! arrayHolders = new IdentityMap(); initTransientCollections(); --- 381,387 ---- entitiesByKey = new HashMap(50); proxiesByKey = new HashMap(10); ! entries = IdentityMap.instantiate(); ! collections = IdentityMap.instantiate(); ! arrayHolders = IdentityMap.instantiate(); initTransientCollections(); *************** *** 1918,1922 **** // It is safe because of how IdentityMap implements entrySet() ! Iterator iter = entries.entrySet().iterator(); while ( iter.hasNext() ) { --- 1923,1927 ---- // It is safe because of how IdentityMap implements entrySet() ! Iterator iter = IdentityMap.entries(entries).iterator(); while ( iter.hasNext() ) { *************** *** 2048,2052 **** private void preFlushEntities() throws HibernateException { ! Iterator iter = entries.entrySet().iterator(); //safe from concurrent modification because of how entrySet() is implemented on IdentityMap while ( iter.hasNext() ) { --- 2053,2057 ---- private void preFlushEntities() throws HibernateException { ! Iterator iter = IdentityMap.entries(entries).iterator(); //safe from concurrent modification because of how entrySet() is implemented on IdentityMap while ( iter.hasNext() ) { *************** *** 2121,2125 **** Map.Entry e = (Map.Entry) iter.next(); if ( ! ( (CollectionEntry) e.getValue() ).reached ) ! updateUnreachableCollection( (PersistentCollection) e.getKey() ); } --- 2126,2130 ---- Map.Entry e = (Map.Entry) iter.next(); if ( ! ( (CollectionEntry) e.getValue() ).reached ) ! updateUnreachableCollection( (PersistentCollection) e.getKey() ); } |