DbEnv::close()
Prev | Chapter 5. The DbEnv Handle | Next

## DbEnv::close()

    #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.

### Parameters

#### flags

The flags parameter must be set to 0 or be set to the following value:

- `DB_FORCESYNC`

  When closing each database handle internally, synchronize the database. If this flag is not specified, the database handle is closed without synchronizing the database.

### Class

DbEnv

### See Also

Database Environments and Related Methods

Prev | Up | Next
DbEnv::add_data_dir() | Home | DbEnv