[Dbix-class] Caching a resultset?

Jesse Sheidlower jester at panix.com
Mon Jan 14 04:35:06 GMT 2013


I have a Catalyst app that very frequently (pretty much every request)
requires several DBIC resultsets that return a small number of values,
that very rarely change. I'm trying to cache this, so I can update the
cache when the values change and not have to hit my DB a half-dozen
times on every request for data that is effectively static.

Originally the relevant line was along the lines of:

  $c->stash->{subjects} = $c->model('WordsDB::Subject')->search();

I replaced this, following the C::P::Cache docs, with 

  unless ( $c->stash->{subjects} = $cache->get( 'subjects' ) ) {
    $c->stash->{subjects} = 
        $c->model('WordsDB::Subject')->search();
    $cache->set( 'subject', $c->stash->{subjects} );
  }

However, this dies (on a second run, when it's actually hitting the
cache) with "undef error - Can't call method "select" on an undefined
value at /usr/share/perl5/DBIx/Class/ResultSet.pm line 957". So I'm
assuming that I can't just stuff a RS into the cache and expect it to
work. Is there an easy way around it? (I know I could retrieve the
actual data and put that into the cache, but then I'd have to rewrite a
whole bunch of templates, that are expecting a resultset.)

Thanks.

Jesse Sheidlower



More information about the DBIx-Class mailing list