Hello everyone! Today I want to introduce you to a super powerful C language database library – Berkeley DB (commonly referred to as BDB). It is a high-performance embedded database system that can help us easily achieve data persistence storage. Whether for small applications or large systems, it can handle it perfectly!
What is Berkeley DB?
Berkeley DB was originally developed by the University of California, Berkeley, and is now maintained by Oracle. Unlike MySQL, which is a standalone database server, it is an embedded database library that can be directly linked to our programs.
In simple terms, it is like a super powerful key-value storage system that helps us securely store data on the hard disk.
Why Choose Berkeley DB?
-
Ultra High Performance: Directly embedded in the application, with no client-server overhead
-
Strong Reliability: Supports transaction processing, ensuring data is never lost
-
Compact Size: The library file is only a few MB
-
Easy to Use: The C language API is designed very elegantly
Getting Started with Berkeley DB
Let’s look at a simple example of storing and retrieving data:
#include <db.h>
#include <stdio.h>
#include <string.h>
int main() {
DB *dbp; // Database handle
int ret; // Return value
// Create database handle
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
fprintf(stderr, "db_create: %s\n", db_strerror(ret));
return 1;
}
// Open database
if ((ret = dbp->open(dbp, NULL, "test.db", NULL,
DB_BTREE, DB_CREATE, 0664)) != 0) {
dbp->err(dbp, ret, "open");
return 1;
}
// Prepare data
DBT key, data;
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
char *key_str = "name";
char *data_str = "Xiao Ming";
key.data = key_str;
key.size = strlen(key_str) + 1;
data.data = data_str;
data.size = strlen(data_str) + 1;
// Store data
if ((ret = dbp->put(dbp, NULL, &key, &data, 0)) != 0) {
dbp->err(dbp, ret, "put");
return 1;
}
// Close database
dbp->close(dbp, 0);
return 0;
}
Tip: When compiling, you need to link the Berkeley DB library using the
-ldb
parameter.
Key Concept Analysis
1. Database Handle (DB *)
The database handle is our entry point for operating the database, created using the db_create
function. It’s like needing a file pointer when opening a file.
2. DBT Structure
The DBT structure is used to store key-value data, containing two important members:
-
data: Pointer to the actual data
-
size: Size of the data
3. Storage Methods
Berkeley DB supports various storage methods:
-
BTREE: Balanced tree, the most commonly used
-
HASH: Hash table, faster lookups
-
QUEUE: Queue storage
-
RECNO: Record number
Advanced Use: Transaction Processing
When we need to ensure the atomicity of data operations, we can use transactions:
int main() {
DB *dbp;
DB_ENV *dbenv;
DB_TXN *txn;
// Initialize environment
env_create(&dbenv, 0);
dbenv->open(dbenv, ".", DB_CREATE | DB_INIT_TXN |
DB_INIT_MPOOL, 0);
// Begin transaction
dbenv->txn_begin(dbenv, NULL, &txn, 0);
// Data operations...
// Commit transaction
txn->commit(txn, 0);
// Cleanup
dbenv->close(dbenv, 0);
return 0;
}
Note: Using transactions incurs some performance overhead but ensures data consistency.
Usage Recommendations
-
Use Cache Wisely: Properly setting cache size can improve performance
-
Regular Backups: Although Berkeley DB is reliable, backups are always a good idea
-
Error Handling: Always check the return value of each API call
-
Resource Release: Remember to close database and environment handles after use
Practice Exercises
-
Try implementing a simple address book program using Berkeley DB to store contact information
-
Implement a bank account transfer function with transactions
-
Try using different storage methods (BTREE, HASH) and compare their performance differences
Friends, that’s all for today’s C language learning journey! Berkeley DB is a very powerful tool, so remember to practice. If you have any questions, feel free to ask me in the comments, and we can discuss together. I wish you all happy learning, and may your C language skills improve continuously!