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
|
<?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>Access method FAQ</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="am_misc.html" title="Chapter 4. Access Method Wrapup" />
<link rel="prev" href="am_misc_tune.html" title="Access method tuning" />
<link rel="next" href="java.html" title="Chapter 5. Java API" />
</head>
<body>
<div xmlns="" class="navheader">
<div class="libver">
<p>Library Version 12.1.6.1</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">Access method FAQ</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="am_misc_tune.html">Prev</a> </td>
<th width="60%" align="center">Chapter 4. Access Method Wrapup </th>
<td width="20%" align="right"> <a accesskey="n" href="java.html">Next</a></td>
</tr>
</table>
<hr />
</div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a id="am_misc_faq"></a>Access method FAQ</h2>
</div>
</div>
</div>
<div class="orderedlist">
<ol type="1">
<li>
<span class="bold">
<strong>Is a Berkeley DB database the same
as a "table"?</strong>
</span>
<p>
Yes; "tables" are databases, "rows" are key/data
pairs, and "columns" are application-encapsulated
fields within a data item (to which Berkeley DB does
not directly provide access).
</p>
</li>
<li>
<span class="bold">
<strong>I'm getting an error return in my
application, but I can't figure out what the library
is complaining about.</strong>
</span>
<p>
See <a href="../api_reference/C/envset_errcall.html" class="olink">DB_ENV->set_errcall()</a>, <a href="../api_reference/C/envset_errfile.html" class="olink">DB_ENV->set_errfile()</a> and
<a href="../api_reference/C/dbset_errfile.html" class="olink">DB->set_errfile()</a> for ways to get additional information
about error returns from Berkeley DB.
</p>
</li>
<li>
<span class="bold">
<strong>Are Berkeley DB databases portable
between architectures with different integer sizes and
different byte orders ?</strong>
</span>
<p>
Yes. Specifically, databases can be moved between
32- and 64-bit machines, as well as between little-
and big-endian machines. See <a class="xref" href="general_am_conf.html#am_conf_byteorder" title="Selecting a byte order">Selecting a byte order</a> for more
information.
</p>
</li>
<li>
<span class="bold">
<strong>I'm seeing database corruption when
creating multiple databases in a single physical
file.</strong>
</span>
<p>
This problem is usually the result of <a href="../api_reference/C/db.html" class="olink">DB</a> handles
not sharing an underlying database environment. See
<a class="xref" href="am_opensub.html" title="Opening multiple databases in a single file">Opening multiple databases in a
single file</a> for more
information.
</p>
</li>
<li>
<span class="bold">
<strong>I'm using integers as keys for a
Btree database, and even though the key/data pairs are
entered in sorted order, the page-fill factor is
low.</strong>
</span>
<p>
This is usually the result of using integer keys on
little-endian architectures such as the x86. Berkeley
DB sorts keys as byte strings, and little-endian
integers don't sort well when viewed as byte strings.
For example, take the numbers 254 through 257. Their
byte patterns on a little-endian system are:
</p>
<pre class="programlisting">254 fe 0 0 0
255 ff 0 0 0
256 0 1 0 0
257 1 1 0 0</pre>
<p>
If you treat them as strings, then they sort
badly:
</p>
<pre class="programlisting">256
257
254
255</pre>
<p>
On a big-endian system, their byte patterns
are:
</p>
<pre class="programlisting">254 0 0 0 fe
255 0 0 0 ff
256 0 0 1 0
257 0 0 1 1</pre>
<p>
and so, if you treat them as strings they sort
nicely. Which means, if you use steadily increasing
integers as keys on a big-endian system Berkeley DB
behaves well and you get compact trees, but on a
little-endian system Berkeley DB produces much less
compact trees. To avoid this problem, you may want to
convert the keys to flat text or big-endian
representations, or provide your own <a class="xref" href="bt_conf.html#am_conf_bt_compare" title="Btree comparison">Btree comparison</a>
</p>
</li>
<li>
<span class="bold">
<strong>Is there any way to avoid double
buffering in the Berkeley DB system?</strong>
</span>
<p>
While you cannot avoid double buffering entirely,
there are a few things you can do to address this
issue:
</p>
<p>
First, the Berkeley DB cache size can be explicitly
set. Rather than allocate additional space in the
Berkeley DB cache to cover unexpectedly heavy load or
large table sizes, double buffering may suggest you
size the cache to function well under normal
conditions, and then depend on the file buffer cache
to cover abnormal conditions. Obviously, this is a
trade-off, as Berkeley DB may not then perform as well
as usual under abnormal conditions.
</p>
<p>
Second, depending on the underlying operating system
you're using, you may be able to alter the amount of
physical memory devoted to the system's file buffer
cache. Altering this type of resource configuration
may require appropriate privileges, or even operating
system reboots and/or rebuilds, on some
systems.
</p>
<p>
Third, changing the size of the Berkeley DB
environment regions can change the amount of space the
operating system makes available for the file buffer
cache, and it's often worth considering exactly how
the operating system is dividing up its available
memory. Further, moving the Berkeley DB database
environment regions from filesystem backed memory into
system memory (or heap memory), can often make
additional system memory available for the file buffer
cache, especially on systems without a unified buffer
cache and VM system.
</p>
<p>
Finally, for operating systems that allow buffering
to be turned off, specifying the <a href="../api_reference/C/envset_flags.html#set_flags_DB_DIRECT_DB" class="olink">DB_DIRECT_DB</a> and
<a href="../api_reference/C/envlog_set_config.html#log_set_config_DB_LOG_DIRECT" class="olink">DB_LOG_DIRECT</a> flags will attempt to do so.
</p>
</li>
<li>
<span class="bold">
<strong>I'm seeing database corruption when
I run out of disk space.</strong>
</span>
<p>
Berkeley DB can continue to run when when
out-of-disk-space errors occur, but it requires the
application to be transaction protected. Applications
which do not enclose update operations in transactions
cannot recover from out-of-disk-space errors, and the
result of running out of disk space may be database
corruption.
</p>
</li>
<li>
<span class="bold">
<strong>How can I associate application
information with a <a href="../api_reference/C/db.html" class="olink">DB</a> or <a href="../api_reference/C/env.html" class="olink">DB_ENV</a> handle?</strong>
</span>
<p>
In the C API, the <a href="../api_reference/C/db.html" class="olink">DB</a> and <a href="../api_reference/C/env.html" class="olink">DB_ENV</a> structures each
contain an "app_private" field intended to be used to
reference application-specific information. See the
<a href="../api_reference/C/dbcreate.html" class="olink">db_create()</a> and <a href="../api_reference/C/envcreate.html" class="olink">db_env_create()</a> documentation for more
information.
</p>
<p>
In the C++ or Java APIs, the easiest way to
associate application-specific data with a handle is
to subclass the <a href="../api_reference/CXX/db.html" class="olink">Db</a> or <a href="../api_reference/CXX/env.html" class="olink">DbEnv</a>, for
example subclassing <a href="../api_reference/CXX/db.html" class="olink">Db</a> to get MyDb.
Objects of type MyDb will still have the Berkeley DB
API methods available on them, and you can put any
extra data or methods you want into the MyDb class. If
you are using "callback" APIs that take <a href="../api_reference/CXX/db.html" class="olink">Db</a>
or <a href="../api_reference/CXX/env.html" class="olink">DbEnv</a> arguments (for example,
<a href="../api_reference/C/dbset_bt_compare.html" class="olink">DB->set_bt_compare()</a>) these will always be called with
the <a href="../api_reference/CXX/db.html" class="olink">Db</a> or <a href="../api_reference/CXX/env.html" class="olink">DbEnv</a> objects you
create. So if you always use MyDb objects, you will be
able to take the first argument to the callback
function and cast it to a MyDb (in C++, cast it to
(MyDb*)). That will allow you to access your data
members or methods.
</p>
</li>
</ol>
</div>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="am_misc_tune.html">Prev</a> </td>
<td width="20%" align="center">
<a accesskey="u" href="am_misc.html">Up</a>
</td>
<td width="40%" align="right"> <a accesskey="n" href="java.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Access method tuning </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> Chapter 5. Java API </td>
</tr>
</table>
</div>
</body>
</html>
|