Hello,
I am hoping you nHibernate gurus can help us with our problem!
We are using nHibernate version 1.2.1.4000, have many databases with
identical schemas, and per the standard recommendation we create a
singleton Session Factory for each database. We have an ASP.Net
application for the UI, and a Windows Service that performs background
operations.
With over a 100 class table mappings (plus relationships and queries),
and having over 120 databases, we are seeing our applications use an
extraordinary amount of memory (~700MB when all 120+ Session Factories
have been created). Using CLR Profiler, it appears nearly all of the
memory on the heap is chewed up from the string data generated from
nHibernate SessionFactoryImpl (hashtables, sqlstrings, loaders, etc.)
which means it will never get cleaned up until the application is shut
down. I did verify that we have the correct number of session
factories (1 per db) so that code is working fine.
For our situation, it would be ideal and more efficient to only have
to load the mappings one time, and be able to use them across all of
our databases.
The big question: Assuming we are not using the Second Level Cache, is
it possible/safe to use the same Session Factory for all of our
databases? Do other people do this? If so, I assume we would have to
handle the connection management...any thoughts on that?
If not, how do people handle this? Our number of databases and
mappings are going to continue to grow and we need to act now. Can you
think of any ways to make this more efficient? I suppose we could
start disposing of Session Factory's if they aren't used for a while,
but it would be a shame to have the delay, and in peak usage time it
may not help at all. Are there any config settings that would help
balance out memory usage vs delay of loading? Maybe new features in
the latest nHibernate release which would help us out?
Our configuration settings:
<nhibernate>
<add key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<add key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2005Dialect" />
<add key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"/>
<add key="hibernate.show_sql" value="false" />
<add key="hibernate.max_fetch_depth" value="3" />
</nhibernate>
Our code for creating a new SessionFactory (if it doesn't already
exist):
Configuration config = new Configuration();
config.AddAssembly("Assembly.Name");
config.SetProperty("hibernate.connection.connection_string",
connectionString);
sessionFactory = config.BuildSessionFactory();
sessionFactoryDictionary.Add(connection_name, sessionFactory);
Thanks so much!
Mike
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en.