Hi guys,
Just to give you the heads up - there are more multi-threading issues lurking in the latest builds of nHibernate. The IndexOfRangeException one has definitely been squished, but I'm seeing intermittent illegal access to loading collections and and open data readers already being associated with an open connection.... they're all happening when trying to load in a child collection from an entity.
These are *all* happening within NH code. In case anyone can track this down before I have a chance to put more test cases together (last one took me a day of stripping stuff down), here are the stack traces.
Exception #1
NHibernate.LazyInitializationException - illegal access to loading collection
at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 460
at NHibernate.Collection.AbstractPersistentCollection.ReadIndexExistence(Object index) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 311
at NHibernate.Collection.Generic.PersistentGenericMap`2.System.Collections.Generic.IDictionary.ContainsKey(TKey key) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\Generic\PersistentGenericMap.cs:line 106
at N2.ContentItem.GetDetail[T](String detailName, T defaultValue) in C:\Users\James\Documents\Visual Studio Projects\n2cms\src\N2\ContentItem.cs:line 394
at TechEye.Web.CmsModel.Pages.Quote.get_Author() in C:\Users\James\Documents\Visual Studio Projects\TheTechEye\TechEye.Web\CmsModel\Parts\Quote.cs:line 29
Exception #2
NHibernate.Exceptions.GenericADOException - could not initialize a collection batch: [N2.ContentItem.Details#System.Object[]][SQL: SELECT details0_.ItemID as ItemID2_, details0_.ID as ID2_, details0_.Name as Name2_, details0_.ID as ID1_1_, details0_.ItemID as ItemID1_1_, details0_.DetailCollectionID as DetailCo4_1_1_, details0_.Name as Name1_1_, details0_.BoolValue as BoolValue1_1_, details0_.IntValue as IntValue1_1_, details0_.LinkValue as LinkValue1_1_, details0_.DoubleValue as DoubleVa9_1_1_, details0_.DateTimeValue as DateTim10_1_1_, details0_.StringValue as StringV11_1_1_, details0_.Value as Value1_1_, details0_.Type as Type1_1_, contentite1_.ID as ID2_0_, contentite1_.Created as Created2_0_, contentite1_.Published as Published2_0_, contentite1_.Updated as Updated2_0_, contentite1_.Expires as Expires2_0_, contentite1_.Name as Name2_0_, contentite1_.ZoneName as ZoneName2_0_, contentite1_.Title as Title2_0_, contentite1_.SortOrder as SortOrder2_0_, contentite1_.Visible as Visible2_0_, contentite1_.SavedBy as SavedBy2_0_, contentite1_.State as State2_0_, contentite1_.AncestralTrail as Ancestr14_2_0_, contentite1_.Trail as Trail2_0_, contentite1_.VersionIndex as Version16_2_0_, contentite1_.VersionOfID as Version17_2_0_, contentite1_.ParentID as ParentID2_0_, contentite1_.Type as Type2_0_ FROM n2Detail details0_ left outer join n2Item contentite1_ on details0_.LinkValue=contentite1_.ID WHERE (details0_.DetailCollectionID IS NULL) and details0_.ItemID in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
at NHibernate.Loader.Loader.LoadCollectionBatch(ISessionImplementor session, Object[] ids, IType type) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1516
at NHibernate.Loader.Collection.BatchingCollectionInitializer.Initialize(Object id, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Collection\BatchingCollectionInitializer.cs:line 41
at NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize(Object key, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Persister\Collection\AbstractCollectionPersister.cs:line 579
at NHibernate.Event.Default.DefaultInitializeCollectionEventListener.OnInitializeCollection(InitializeCollectionEvent event) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Event\Default\DefaultInitializeCollectionEventListener.cs:line 52
at NHibernate.Impl.SessionImpl.InitializeCollection(IPersistentCollection collection, Boolean writing) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 1637
at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 463
at NHibernate.Collection.AbstractPersistentCollection.ReadIndexExistence(Object index) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 311
at NHibernate.Collection.Generic.PersistentGenericMap`2.System.Collections.Generic.IDictionary.ContainsKey(TKey key) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\Generic\PersistentGenericMap.cs:line 106
at N2.ContentItem.GetDetail[T](String detailName, T defaultValue) in C:\Users\James\Documents\Visual Studio Projects\n2cms\src\N2\ContentItem.cs:line 394
at TechEye.Web.CmsModel.Pages.Quote.get_Author() in C:\Users\James\Documents\Visual Studio Projects\TheTechEye\TechEye.Web\CmsModel\Parts\Quote.cs:line 29
...
System.InvalidOperationException - There is already an open DataReader associated with this Command which must be closed first.
at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line 261
at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1327
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 401
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 236
at NHibernate.Loader.Loader.LoadCollectionBatch(ISessionImplementor session, Object[] ids, IType type) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1508
Exception #3
NHibernate.Exceptions.GenericADOException - could not initialize a collection batch: [N2.ContentItem.Details#System.Object[]][SQL: SELECT details0_.ItemID as ItemID2_, details0_.ID as ID2_, details0_.Name as Name2_, details0_.ID as ID1_1_, details0_.ItemID as ItemID1_1_, details0_.DetailCollectionID as DetailCo4_1_1_, details0_.Name as Name1_1_, details0_.BoolValue as BoolValue1_1_, details0_.IntValue as IntValue1_1_, details0_.LinkValue as LinkValue1_1_, details0_.DoubleValue as DoubleVa9_1_1_, details0_.DateTimeValue as DateTim10_1_1_, details0_.StringValue as StringV11_1_1_, details0_.Value as Value1_1_, details0_.Type as Type1_1_, contentite1_.ID as ID2_0_, contentite1_.Created as Created2_0_, contentite1_.Published as Published2_0_, contentite1_.Updated as Updated2_0_, contentite1_.Expires as Expires2_0_, contentite1_.Name as Name2_0_, contentite1_.ZoneName as ZoneName2_0_, contentite1_.Title as Title2_0_, contentite1_.SortOrder as SortOrder2_0_, contentite1_.Visible as Visible2_0_, contentite1_.SavedBy as SavedBy2_0_, contentite1_.State as State2_0_, contentite1_.AncestralTrail as Ancestr14_2_0_, contentite1_.Trail as Trail2_0_, contentite1_.VersionIndex as Version16_2_0_, contentite1_.VersionOfID as Version17_2_0_, contentite1_.ParentID as ParentID2_0_, contentite1_.Type as Type2_0_ FROM n2Detail details0_ left outer join n2Item contentite1_ on details0_.LinkValue=contentite1_.ID WHERE (details0_.DetailCollectionID IS NULL) and details0_.ItemID in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
at NHibernate.Loader.Loader.LoadCollectionBatch(ISessionImplementor session, Object[] ids, IType type) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1516
at NHibernate.Loader.Collection.BatchingCollectionInitializer.Initialize(Object id, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Collection\BatchingCollectionInitializer.cs:line 41
at NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize(Object key, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Persister\Collection\AbstractCollectionPersister.cs:line 579
at NHibernate.Event.Default.DefaultInitializeCollectionEventListener.OnInitializeCollection(InitializeCollectionEvent event) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Event\Default\DefaultInitializeCollectionEventListener.cs:line 52
at NHibernate.Impl.SessionImpl.InitializeCollection(IPersistentCollection collection, Boolean writing) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 1637
at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 463
at NHibernate.Collection.AbstractPersistentCollection.ReadIndexExistence(Object index) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 311
at NHibernate.Collection.Generic.PersistentGenericMap`2.System.Collections.Generic.IDictionary.ContainsKey(TKey key) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Collection\Generic\PersistentGenericMap.cs:line 106
at N2.ContentItem.GetDetail[T](String detailName, T defaultValue) in C:\Users\James\Documents\Visual Studio Projects\n2cms\src\N2\ContentItem.cs:line 394
at TechEye.Web.CmsModel.Pages.Quote.get_Author() in C:\Users\James\Documents\Visual Studio Projects\TheTechEye\TechEye.Web\CmsModel\Parts\Quote.cs:line 29
...
System.InvalidOperationException - Invalid attempt to read when no data is present.
at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
at System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i)
at NHibernate.Driver.NHybridDataReader.IsDBNull(Int32 i) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Driver\NHybridDataReader.cs:line 233
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Type\NullableType.cs:line 238
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Type\NullableType.cs:line 195
at NHibernate.Type.ManyToOneType.Hydrate(IDataReader rs, String[] names, ISessionImplementor session, Object owner) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Type\ManyToOneType.cs:line 83
at NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate(IDataReader rs, Object id, Object obj, ILoadable rootLoadable, String[][] suffixedPropertyColumns, Boolean allProperties, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 2507
at NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, String instanceClass, EntityKey key, String rowIdAlias, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 980
at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, String rowIdAlias, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 938
at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 867
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 322
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 467
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 236
at NHibernate.Loader.Loader.LoadCollectionBatch(ISessionImplementor session, Object[] ids, IType type) in c:\Users\James\Documents\Visual Studio Projects\External Projects\NHibernate\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1508
Thank you
James