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.