#include <db_cxx.h> DbEnv::close(u_int32_t flags);
The DbEnv::close()
method closes the
Berkeley DB environment, freeing any allocated resources and
closing all database handles opened with this environment handle,
as well as closing any underlying subsystems.
When you call the DbEnv::close()
method,
all open Db handles and
Dbc handles are closed
automatically by this function. And, when you close a database
handle, all cursors opened with it are closed automatically.
In multiple threads of control, each thread of control opens a
database environment and the database handles within it. When you
close each database handle using the
DbEnv::close()
method, by default, the
database is not synchronized and is similar to calling the
Db::close(DB_NOSYNC)
method. This is to
avoid unncessary database synchronization when there are multiple
environment handles open. To ensure all open database handles are
synchronized when you close the last environment handle, set the
flag parameter value of the DbEnv::close()
method to DB_FORCESYNC. This is similar to calling the
Db::close(0)
method to close each database
handle.
If a database close operation fails, the method returns a non-zero error value for the first instance of such an error, and continues to close the rest of the database and environment handles.
The DbEnv handle should not be closed while any other handle that refers to it is not yet closed; for example, database environment handles must not be closed while transactions in the environment have not yet been committed or aborted. Specifically, this includes the DbTxn, DbLogc and DbMpoolFile handles.
Where the environment was initialized with the
DB_INIT_LOCK flag,
calling DbEnv::close()
does not release any locks still held by the
closing process, providing functionality for long-lived locks.
Processes that want to have all their locks released can do so by
issuing the appropriate
DbEnv::lock_vec()
call.
Where the environment was initialized with the
DB_INIT_MPOOL flag,
calling DbEnv::close()
implies calls to
DbMpoolFile::close()
for any
remaining open files in the memory pool that were returned to this
process by calls to
DbMpoolFile::open()
. It does
not imply a call to
DbMpoolFile::sync()
for those
files.
Where the environment was initialized with the
DB_INIT_TXN
flag, calling DbEnv::close()
aborts any
unresolved transactions. Applications should not depend on this
behavior for transactions involving Berkeley DB databases; all
such transactions should be explicitly resolved. The problem with
depending on this semantic is that aborting an unresolved
transaction involving database operations requires a database
handle. Because the database handles should have been closed
before calling DbEnv::close()
, it will not
be possible to abort the transaction, and recovery will have to be
run on the Berkeley DB environment before further operations are
done.
Where log cursors were created using the
DbEnv::log_cursor()
method,
calling DbEnv::close()
does not imply
closing those cursors.
In multithreaded applications, only a single thread may call the
DbEnv::close()
method.
After DbEnv::close()
has been called,
regardless of its return, the Berkeley DB environment handle may
not be accessed again.
The DbEnv::close()
method either returns a non-zero error value or throws an
exception that encapsulates a non-zero error value on
failure, and returns 0 on success.
The flags parameter must be set to 0 or be set to one of the following values:
When closing each database handle internally, synchronize the database. If this flag is not specified, the database handle is closed without synchronizing the database.
DB_FORCESYNCENV
When closing the enviroment, flush memory
mapped environment regions to disk. Specifying
this flag may help prevent loss of updates when
__db.00*
files are on NFS
storage. However, there is a risk that this
flag will significantly slow down this method
call.