Hey,

The latest MLDBM::Sync v.07 is in your local CPAN and also
  http://www.perl.com/CPAN-local/modules/by-module/MLDBM/

It provides a wrapper around MLDBM databases, like SDBM_File
and DB_File, providing safe concurrent access, using a flock()
strategy and per access dbm i/o flushing.  

A recent API addition allows for a secondary cache layer with
Tie::Cache to be automatically used, like:

  my $sync_dbm_obj = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 0640;
  $sync_dbm_obj->SyncCacheSize('100K');

On my dual PIII 450 linux box, I might get 1500 or so reads per sec 
to a SDBM_File based MLDBM::Sync database, and the Tie::Cache layer
runs at about 15000 reads/sec, so for a high cache hit usage, the 
speedup can be considerable.

MLDBM::Sync also comes with MLDBM::Sync::SDBM_File, a wrapper around 
SDBM_File that overcomes its 1024 byte limit for values, which 
can be fast for caching data up to 10000 bytes or so in length.

-- Josh

CHANGES

$MODULE = "MLDBM::Sync"; $VERSION = .07; $DATE = 'TBA';

+ $dbm->SyncCacheSize() API activates 2nd layer RAM cache
  via Tie::Cache with MaxBytes set.

+ CACHE documentation, cache.t test, sample benchmarks
  with ./bench/bench_sync.pl -c

$MODULE = "MLDBM::Sync"; $VERSION = .05; $DATE = '2001/03/13';

+ Simpler use of locking.

- Read locking works on Solaris, had to open lock file in
  read/write mode.  Linux/NT didn't care.

NAME
      MLDBM::Sync (BETA) - safe concurrent access to MLDBM databases

SYNOPSIS
      use MLDBM::Sync;                       # this gets the default, SDBM_File
      use MLDBM qw(DB_File Storable);        # use Storable for serializing
      use MLDBM qw(MLDBM::Sync::SDBM_File);  # use extended SDBM_File, handles values 
> 1024 bytes

      # NORMAL PROTECTED read/write with implicit locks per i/o request
      my $sync_dbm_obj = tie %cache, 'MLDBM::Sync' [..other DBM args..] or die $!;
      $cache{"AAAA"} = "BBBB";
      my $value = $cache{"AAAA"};

      # SERIALIZED PROTECTED read/write with explicit lock for both i/o requests
      my $sync_dbm_obj = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 
0640;
      $sync_dbm_obj->Lock;
      $cache{"AAAA"} = "BBBB";
      my $value = $cache{"AAAA"};
      $sync_dbm_obj->UnLock;

      # SERIALIZED PROTECTED READ access with explicit read lock for both reads
      $sync_dbm_obj->ReadLock;
      my @keys = keys %cache;
      my $value = $cache{'AAAA'};
      $sync_dbm_obj->UnLock;

      # MEMORY CACHE LAYER with Tie::Cache
      $sync_dbm_obj->SyncCacheSize('100K');

      # KEY CHECKSUMS, for lookups on MD5 checksums on large keys
      my $sync_dbm_obj = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 
0640;
      $sync_dbm_obj->SyncKeysChecksum(1);
      my $large_key = "KEY" x 10000;
      $sync{$large_key} = "LARGE";
      my $value = $sync{$large_key};

DESCRIPTION
    This module wraps around the MLDBM interface, by handling concurrent
    access to MLDBM databases with file locking, and flushes i/o explicity
    per lock/unlock. The new [Read]Lock()/UnLock() API can be used to
    serialize requests logically and improve performance for bundled reads &
    writes.

      my $sync_dbm_obj = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 
0640;

      # Write locked critical section
      $sync_dbm_obj->Lock;
        ... all accesses to DBM LOCK_EX protected, and go to same tied file handles
        $cache{'KEY'} = 'VALUE';
      $sync_dbm_obj->UnLock;

      # Read locked critical section
      $sync_dbm_obj->ReadLock;
        ... all read accesses to DBM LOCK_SH protected, and go to same tied files
        ... WARNING, cannot write to DBM in ReadLock() section, will die()
        my $value = $cache{'KEY'};
      $sync_dbm_obj->UnLock;

      # Normal access OK too, without explicity locking
      $cache{'KEY'} = 'VALUE';
      my $value = $cache{'KEY'};

    MLDBM continues to serve as the underlying OO layer that serializes
    complex data structures to be stored in the databases. See the MLDBM the
    BUGS manpage section for important limitations.

    MLDBM::Sync also provides built in RAM caching with Tie::Cache md5 key
    checksum functionality.

Reply via email to