1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Chapter 8. Berkeley DB Architecture</title>
<link rel="stylesheet" href="gettingStarted.css" type="text/css" />
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
<link rel="start" href="index.html" title="Berkeley DB Programmer's Reference Guide" />
<link rel="up" href="index.html" title="Berkeley DB Programmer's Reference Guide" />
<link rel="prev" href="stl_known_issues.html" title="Dbstl known issues" />
<link rel="next" href="arch_progmodel.html" title="Programming model" />
</head>
<body>
<div xmlns="" class="navheader">
<div class="libver">
<p>Library Version 11.2.5.3</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Chapter 8.
Berkeley DB Architecture
</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="stl_known_issues.html">Prev</a> </td>
<th width="60%" align="center"> </th>
<td width="20%" align="right"> <a accesskey="n" href="arch_progmodel.html">Next</a></td>
</tr>
</table>
<hr />
</div>
<div class="chapter" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title"><a id="arch"></a>Chapter 8.
Berkeley DB Architecture
</h2>
</div>
</div>
</div>
<div class="toc">
<p>
<b>Table of Contents</b>
</p>
<dl>
<dt>
<span class="sect1">
<a href="arch.html#arch_bigpic">The big picture</a>
</span>
</dt>
<dt>
<span class="sect1">
<a href="arch_progmodel.html">Programming model</a>
</span>
</dt>
<dt>
<span class="sect1">
<a href="arch_apis.html">Programmatic APIs</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="sect2">
<a href="arch_apis.html#idp51640232">C</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="arch_apis.html#idp51656168">C++</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="arch_apis.html#idp51646944">STL</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="arch_apis.html#idp51647760">Java</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="arch_apis.html#idp51664896">Dbm/Ndbm, Hsearch</a>
</span>
</dt>
</dl>
</dd>
<dt>
<span class="sect1">
<a href="arch_script.html">Scripting languages</a>
</span>
</dt>
<dd>
<dl>
<dt>
<span class="sect2">
<a href="arch_script.html#idp51640920">Perl</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="arch_script.html#idp51639128">PHP</a>
</span>
</dt>
<dt>
<span class="sect2">
<a href="arch_script.html#idp51657264">Tcl</a>
</span>
</dt>
</dl>
</dd>
<dt>
<span class="sect1">
<a href="arch_utilities.html">Supporting utilities</a>
</span>
</dt>
</dl>
</div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a id="arch_bigpic"></a>The big picture</h2>
</div>
</div>
</div>
<p>The previous chapters in this Reference Guide have described
applications that use the Berkeley DB access methods for fast data storage
and retrieval. The applications described in the following chapters
are similar in nature to the access method applications, but they are
also threaded and/or recoverable in the face of application or system
failure.</p>
<p>Application code that uses only the Berkeley DB access methods might appear
as follows:</p>
<pre class="programlisting">switch (ret = dbp->/put(dbp, NULL, &key, &data, 0)) {
case 0:
printf("db: %s: key stored.\n", (char *)key.data);
break;
default:
dbp->/err(dbp, ret, "dbp->/put");
exit (1);
}</pre>
<p>The underlying Berkeley DB architecture that supports this is</p>
<div class="mediaobject">
<img src="arch_smallpic.gif" />
</div>
<p>As you can see from this diagram, the application makes calls into the
access methods, and the access methods use the underlying shared memory
buffer cache to hold recently used file pages in main memory.</p>
<p>When applications require recoverability, their calls to the Access
Methods must be wrapped in calls to the transaction subsystem. The
application must inform Berkeley DB where to begin and end transactions, and
must be prepared for the possibility that an operation may fail at any
particular time, causing the transaction to abort.</p>
<p>An example of transaction-protected code might appear as follows:</p>
<pre class="programlisting">for (fail = 0;;) {
/* Begin the transaction. */
if ((ret = dbenv->/txn_begin(dbenv, NULL, &tid, 0)) != 0) {
dbenv->/err(dbenv, ret, "dbenv->/txn_begin");
exit (1);
}
/* Store the key. */
switch (ret = dbp->/put(dbp, tid, &key, &data, 0)) {
case 0:
/* Success: commit the change. */
printf("db: %s: key stored.\n", (char *)key.data);
if ((ret = tid->/commit(tid, 0)) != 0) {
dbenv->/err(dbenv, ret, "DB_TXN->/commit");
exit (1);
}
return (0);
case DB_LOCK_DEADLOCK:
default:
/* Failure: retry the operation. */
if ((t_ret = tid->/abort(tid)) != 0) {
dbenv->/err(dbenv, t_ret, "DB_TXN->/abort");
exit (1);
}
if (fail++ == MAXIMUM_RETRY)
return (ret);
continue;
}
}</pre>
<p>In this example, the same operation is being done as before; however,
it is wrapped in transaction calls. The transaction is started with
<a href="../api_reference/C/txnbegin.html" class="olink">DB_ENV->txn_begin()</a> and finished with <a href="../api_reference/C/txncommit.html" class="olink">DB_TXN->commit()</a>. If the
operation fails due to a deadlock, the transaction is aborted using
<a href="../api_reference/C/txnabort.html" class="olink">DB_TXN->abort()</a>, after which the operation may be retried.</p>
<p>There are actually five major subsystems in Berkeley DB, as follows:</p>
<div class="variablelist">
<dl>
<dt>
<span class="term">Access Methods</span>
</dt>
<dd>The access methods subsystem provides general-purpose support for
creating and accessing database files formatted as Btrees, Hashed files,
and Fixed- and Variable-length records. These modules are useful in
the absence of transactions for applications that need fast formatted
file support. See <a href="../api_reference/C/dbopen.html" class="olink">DB->open()</a> and <a href="../api_reference/C/dbcursor.html" class="olink">DB->cursor()</a> for more
information. These functions were already discussed in detail in the
previous chapters.</dd>
<dt>
<span class="term">Memory Pool</span>
</dt>
<dd>The Memory Pool subsystem is the general-purpose shared memory buffer pool
used by Berkeley DB. This is the shared memory cache that allows multiple
processes and threads within processes to share access to databases. This
module is useful outside of the Berkeley DB package for processes that require
portable, page-oriented, cached, shared file access.</dd>
<dt>
<span class="term">Transaction</span>
</dt>
<dd>The Transaction subsystem allows a group of database changes to be
treated as an atomic unit so that either all of the changes are done,
or none of the changes are done. The transaction subsystem implements
the Berkeley DB transaction model. This module is useful outside of the Berkeley DB
package for processes that want to transaction-protect their own data
modifications.</dd>
<dt>
<span class="term">Locking</span>
</dt>
<dd>The Locking subsystem is the general-purpose lock manager used by Berkeley DB.
This module is useful outside of the Berkeley DB package for processes that
require a portable, fast, configurable lock manager.</dd>
<dt>
<span class="term">Logging</span>
</dt>
<dd>The Logging subsystem is the write-ahead logging used to support the
Berkeley DB transaction model. It is largely specific to the Berkeley DB package,
and unlikely to be useful elsewhere except as a supporting module for
the Berkeley DB transaction subsystem.</dd>
</dl>
</div>
<p>Here is a more complete picture of the Berkeley DB library:</p>
<div class="mediaobject">
<img src="arch_bigpic.gif" />
</div>
<p>In this model, the application makes calls to the access methods and to
the Transaction subsystem. The access methods and Transaction subsystems
in turn make calls into the Memory Pool, Locking and Logging subsystems
on behalf of the application.</p>
<p>The underlying subsystems can be used independently by applications.
For example, the Memory Pool subsystem can be used apart from the rest
of Berkeley DB by applications simply wanting a shared memory buffer pool, or
the Locking subsystem may be called directly by applications that are
doing their own locking outside of Berkeley DB. However, this usage is not
common, and most applications will either use only the access methods
subsystem, or the access methods subsystem wrapped in calls to the Berkeley DB
transaction interfaces.</p>
</div>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="stl_known_issues.html">Prev</a> </td>
<td width="20%" align="center"> </td>
<td width="40%" align="right"> <a accesskey="n" href="arch_progmodel.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Dbstl known issues </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> Programming model</td>
</tr>
</table>
</div>
</body>
</html>
|