2 Replies Latest reply on Oct 29, 2007 1:04 PM by Damian Harvey

    Storing large recordset in memory

    Damian Harvey Master

      I have a table with a large number of very static records that I'd prefer to store once when the application starts and have every user reference rather than hitting the database.

      What is the best/nicest way to achieve this? The obvious contenders so far:
      1. Application scoped Bean that I load using @Startup.
      2. JBoss Cache

      Can anyone recommend one approach over the other or suggest an alternative?

      Thanks,

      Damian.

        • 1. Re: Storing large recordset in memory
          Pete Muir Master

          Hibernate 2nd level cache.

          • 2. Re: Storing large recordset in memory
            Damian Harvey Master

            I've been looking into the second level cache and following this rather good article: http://www.devx.com/dbzone/Article/29685/0/page/1. My setup appears correct however I'm getting no performance improvement.

            My test reads 10,000 UN Location codes in 10 iterations. I would expect the last 9 to be quicker but the reverse is happening:

            16:31:45,699 INFO [STDOUT] Iteration 0 took 3190 ms
            16:31:51,757 INFO [STDOUT] Iteration 1 took 6058 ms
            16:31:57,237 INFO [STDOUT] Iteration 2 took 5480 ms
            16:32:02,964 INFO [STDOUT] Iteration 3 took 5727 ms
            16:32:10,310 INFO [STDOUT] Iteration 4 took 7346 ms
            16:32:15,971 INFO [STDOUT] Iteration 5 took 5661 ms
            16:32:21,670 INFO [STDOUT] Iteration 6 took 5699 ms
            16:32:27,176 INFO [STDOUT] Iteration 7 took 5506 ms
            16:32:32,882 INFO [STDOUT] Iteration 8 took 5706 ms
            16:32:38,628 INFO [STDOUT] Iteration 9 took 5746 ms
            


            On server startup I get the following logs, which to me indicate a working setup:
            16:21:15,028 INFO [SettingsFactory] Second-level cache: enabled
            16:21:15,029 INFO [SettingsFactory] Query cache: disabled
            16:21:15,029 INFO [SettingsFactory] Cache provider: net.sf.ehcache.hibernate.EhCacheProvider
            ...
            ...
            16:20:59,140 WARN [CacheFactory] read-only cache configured for mutable class: Odyssey0_5_0_ear,Odyssey0_5_0.UnLocode
            

            I have an ehcache.xml in my classpath with the following entry:
             <cache name="UnLocode"
             maxElementsInMemory="90000"
             eternal="true"
             overflowToDisk="false"
             />
            

            Where my entity is annotated with a region of 'UnLocode' (I've tried with no region and using class as well):
            @Entity
            @Table(name = "UN_LOCODE")
            @Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region="UnLocode")
            public class UnLocode implements java.io.Serializable {
            


            Interestingly if I change my queries to include .setHint("org.hibernate.cacheable", new Boolean(true)) then I don't get 10 Hibernate queries but the times don't change much at all.

            Is there something that I'm missing?

            I'll be asking this on the Ehcache forum but thought I'd continue here first.

            Thanks,

            Damian.