mirror of
https://github.com/berkeleydb/libdb.git
synced 2024-11-16 17:16:25 +00:00
818 lines
40 KiB
HTML
818 lines
40 KiB
HTML
<?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>Using Stored Collections</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 Collections Tutorial" />
|
||
<link rel="up" href="collectionOverview.html" title="Appendix A. API Notes and Details" />
|
||
<link rel="prev" href="UsingCollectionsAPI.html" title="Using the DB Java Collections API" />
|
||
<link rel="next" href="SerializedObjectStorage.html" title="Serialized Object Storage" />
|
||
</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">
|
||
Using Stored Collections
|
||
</th>
|
||
</tr>
|
||
<tr>
|
||
<td width="20%" align="left"><a accesskey="p" href="UsingCollectionsAPI.html">Prev</a> </td>
|
||
<th width="60%" align="center">Appendix A.
|
||
API Notes and Details
|
||
</th>
|
||
<td width="20%" align="right"> <a accesskey="n" href="SerializedObjectStorage.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="UsingStoredCollections"></a>
|
||
Using Stored Collections
|
||
</h2>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="toc">
|
||
<dl>
|
||
<dt>
|
||
<span class="sect2">
|
||
<a href="UsingStoredCollections.html#StoredCollectionAccessMethods">
|
||
Stored Collection and Access Methods
|
||
</a>
|
||
</span>
|
||
</dt>
|
||
<dt>
|
||
<span class="sect2">
|
||
<a href="UsingStoredCollections.html#StoredVersusStandardCollections">
|
||
Stored Collections Versus Standard Java Collections
|
||
</a>
|
||
</span>
|
||
</dt>
|
||
<dt>
|
||
<span class="sect2">
|
||
<a href="UsingStoredCollections.html#StoredCollectionCharacteristics">
|
||
Other Stored Collection Characteristics
|
||
</a>
|
||
</span>
|
||
</dt>
|
||
<dt>
|
||
<span class="sect2">
|
||
<a href="UsingStoredCollections.html#WhyJavaCollections">
|
||
Why Java Collections for Berkeley DB
|
||
</a>
|
||
</span>
|
||
</dt>
|
||
</dl>
|
||
</div>
|
||
<p>
|
||
When a stored collection is created it is based on either a
|
||
|
||
<a class="ulink" href="../../java/com/sleepycat/db/Database.html" target="_top">Database</a>
|
||
|
||
or a
|
||
|
||
<span>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/SecondaryDatabase.html" target="_top">SecondaryDatabase</a>.
|
||
</span>
|
||
When a database is used, the primary key of the database is used as
|
||
the collection key. When a secondary database is used, the index
|
||
key is used as the collection key. Indexed collections can be used
|
||
for reading elements and removing elements but not for adding or
|
||
updating elements.
|
||
</p>
|
||
<div class="sect2" lang="en" xml:lang="en">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div>
|
||
<h3 class="title"><a id="StoredCollectionAccessMethods"></a>
|
||
Stored Collection and Access Methods
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>
|
||
The use of stored collections is constrained in certain respects as
|
||
described below.
|
||
<span>
|
||
Most of these restrictions have to do with
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html" target="_top">List</a>
|
||
|
||
interfaces; for
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html" target="_top">Map</a>
|
||
|
||
interfaces, most all access modes are fully supported since the
|
||
Berkeley DB model is map-like.
|
||
</span>
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="disc">
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedSet.html" target="_top">SortedSet</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html" target="_top">SortedMap</a>
|
||
|
||
|
||
interfaces may only be used if keys are ordered. This means ordered keys are required for creating a
|
||
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredSortedEntrySet.html" target="_top">StoredSortedEntrySet</a>,
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredSortedKeySet.html" target="_top">StoredSortedKeySet</a>,
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredSortedMap.html" target="_top">StoredSortedMap</a>, or
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredSortedValueSet.html" target="_top">StoredSortedValueSet</a>.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
All iterators for stored collections implement the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html" target="_top">ListIterator</a>
|
||
|
||
interface as well as the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html" target="_top">Iterator</a>
|
||
|
||
interface.
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#hasPrevious()" target="_top">ListIterator.hasPrevious()</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#previous()" target="_top">ListIterator.previous()</a>
|
||
|
||
work in all cases.
|
||
<span>
|
||
However, the following
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html" target="_top">ListIterator</a>
|
||
|
||
method behavior is dependent on the access method.
|
||
</span>
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="circle">
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#nextIndex()" target="_top">ListIterator.nextIndex()</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#previousIndex()" target="_top">ListIterator.previousIndex()</a>
|
||
|
||
only work when record number keys are used, and throw
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html" target="_top">UnsupportedOperationException</a>
|
||
|
||
otherwise.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#add()" target="_top">ListIterator.add()</a>
|
||
|
||
inserts before the current position and renumbers following keys if the RECNO-RENUMBER
|
||
access method is used.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
For all access methods other than RECNO-RENUMBER:
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="square">
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#add()" target="_top">ListIterator.add()</a>
|
||
|
||
throws
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html" target="_top">UnsupportedOperationException</a>
|
||
|
||
if duplicates are not allowed.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#add()" target="_top">ListIterator.add()</a>
|
||
|
||
inserts a duplicate before the current position
|
||
if duplicates are unsorted.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#add()" target="_top">ListIterator.add()</a>
|
||
|
||
inserts a duplicate in sorted order if
|
||
duplicates are sorted.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#set()" target="_top">ListIterator.set()</a>
|
||
|
||
throws
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html" target="_top">UnsupportedOperationException</a>
|
||
|
||
if sorted duplicates are configured, since updating with sorted duplicates would change the
|
||
iterator position.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html#setValue()" target="_top">Map.Entry.setValue()</a>
|
||
|
||
throws
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html" target="_top">UnsupportedOperationException</a>
|
||
|
||
if duplicates are sorted.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Only the access methods that use a record number key may be used
|
||
with a
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html" target="_top">List</a>
|
||
<code class="classname">List</code>
|
||
view.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
To create a stored List that supports the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#add()" target="_top">List.add()</a>
|
||
<code class="methodname">List.add()</code>
|
||
method, only the RECNO-RENUMBER access method may be used.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
For List access methods that do not support
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#add()" target="_top">List.add()</a>
|
||
<code class="methodname">List.add()</code>
|
||
(RECNO, QUEUE, and BTREE-RECNUM):
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="circle">
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#add()" target="_top">List.add()</a>
|
||
<code class="methodname">List.add()</code>
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#add()" target="_top">ListIterator.add()</a>
|
||
<code class="methodname">ListIterator.add()</code>
|
||
always throw
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html" target="_top">UnsupportedOperationException</a> .
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#remove()" target="_top">List.remove()</a>
|
||
<code class="methodname">List.remove()</code>
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#remove()" target="_top">ListIterator.remove()</a>
|
||
<code class="methodname">ListIterator.remove()</code>
|
||
do not cause list indices to be renumbered. However, iterators will skip
|
||
the removed values.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<p>
|
||
For these access methods, stored Lists are most useful as
|
||
read-only collections where indices are not required to be
|
||
sequential.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
When duplicates are allowed the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html" target="_top">Collection</a>
|
||
|
||
interfaces are modified in several ways as described in the next
|
||
section.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="sect2" lang="en" xml:lang="en">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div>
|
||
<h3 class="title"><a id="StoredVersusStandardCollections"></a>
|
||
Stored Collections Versus Standard Java Collections
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>
|
||
Stored collections have the following differences with the
|
||
standard Java collection interfaces. Some of these are interface
|
||
contract violations.
|
||
</p>
|
||
<p>
|
||
The Java collections interface does not support duplicate keys
|
||
(multi-maps or multi-sets). When the access method allows duplicate
|
||
keys, the collection interfaces are defined as follows.
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="disc">
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html#entrySet()" target="_top">Map.entrySet()</a>
|
||
|
||
may contain multiple
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html" target="_top">Map.Entry</a>
|
||
|
||
objects with the same key.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html#keySet()" target="_top">Map.keySet()</a>
|
||
|
||
always contains unique keys, it does not contain duplicates.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html#values()" target="_top">Map.values()</a>
|
||
|
||
contains all values including the values
|
||
associated with duplicate keys.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html#put()" target="_top">Map.put()</a>
|
||
|
||
appends a duplicate if the key already exists rather than replacing
|
||
the existing value, and always returns null.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html#remove()" target="_top">Map.remove()</a>
|
||
|
||
removes all duplicates for the specified key.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html#get()" target="_top">Map.get()</a>
|
||
|
||
returns the first duplicate for the specified key.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredMap.html#duplicates(java.lang.Object)" target="_top">StoredMap.duplicates()</a>
|
||
|
||
is an additional method for returning the values for a given key as a
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html" target="_top">Collection</a>.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<p>
|
||
Other differences are:
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="disc">
|
||
<li>
|
||
<p>
|
||
Collection.size() and Map.size() always throws
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html" target="_top">UnsupportedOperationException</a>.
|
||
This is because the number of
|
||
records in a database cannot be determined reliably or
|
||
cheaply.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Because the size() method cannot be used, the bulk operation
|
||
methods of standard Java collections cannot be passed stored
|
||
collections as parameters, since the implementations rely on
|
||
size(). However, the bulk operation methods of stored collections
|
||
can be passed standard Java collections as parameters.
|
||
<code class="literal">storedCollection.addAll(standardCollection)</code> is allowed
|
||
while <code class="literal">standardCollection.addAll(storedCollection)</code> is
|
||
<span class="emphasis"><em>not</em></span> allowed. This restriction applies to the standard
|
||
collection constructors that take a Collection parameter (copy
|
||
constructors), the Map.putAll() method, and the following
|
||
Collection methods: addAll(), containsAll(), removeAll() and
|
||
retainAll().
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
The <code class="methodname">ListIterator.nextIndex()</code> method
|
||
returns <code class="literal">Integer.MAX_VALUE</code>
|
||
for stored lists when positioned at the end of the list, rather
|
||
than returning the list size as specified by the ListIterator
|
||
interface. Again, this is because the database size is not
|
||
available.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Comparator.html" target="_top">Comparator</a>
|
||
|
||
objects cannot be used and the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html#comparator()" target="_top">SortedMap.comparator()</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedSet.html#comparator()" target="_top">SortedSet.comparator()</a>
|
||
|
||
methods always return null. The
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Comparable.html" target="_top">Comparable</a>
|
||
|
||
interface is not supported. However, Comparators that operate on
|
||
byte arrays may be specified using
|
||
|
||
<span>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseConfig.html#setBtreeComparator(java.util.Comparator)" target="_top">DatabaseConfig.setBtreeComparator</a>.
|
||
</span>
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
The
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#equals()" target="_top">Object.equals()</a>
|
||
|
||
method is not used to determine whether a key
|
||
or value is contained in a collection, to locate a value by key,
|
||
etc. Instead the byte array representation of the keys and values
|
||
are used. However, the equals() method <span class="emphasis"><em>is</em></span> called for each
|
||
key and value when comparing two collections for equality. It is
|
||
the responsibility of the application to make sure that the
|
||
equals() method returns true if and only if the byte array
|
||
representations of the two objects are equal. Normally this occurs
|
||
naturally since the byte array representation is derived from the
|
||
object's fields.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="sect2" lang="en" xml:lang="en">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div>
|
||
<h3 class="title"><a id="StoredCollectionCharacteristics"></a>
|
||
Other Stored Collection Characteristics
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>
|
||
The following characteristics of stored collections are
|
||
extensions of the definitions in the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/package-summary.html" target="_top">java.util</a>
|
||
|
||
package. These differences do not violate the Java
|
||
collections interface contract.
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="disc">
|
||
<li>
|
||
<p>
|
||
All stored collections are thread safe (can be used by multiple
|
||
threads concurrently)
|
||
<span>
|
||
whenever the Berkeley DB Concurrent Data Store or
|
||
Transactional Data Store environment is used.
|
||
</span>
|
||
Locking is handled by the Berkeley DB
|
||
environment. To access a collection from multiple threads, creation
|
||
of synchronized collections using the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html" target="_top">Collections</a>
|
||
|
||
class is not necessary
|
||
<span>
|
||
except when using the Data Store environment.
|
||
</span>
|
||
Iterators, however, should always be used only by a single thread.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
All stored collections may be read-only if desired by passing
|
||
false for the writeAllowed parameter of their constructor. Creation
|
||
of immutable collections using the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html" target="_top">Collections</a>
|
||
|
||
class is not necessary.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
A stored collection is partially read-only if a secondary
|
||
index is used. Specifically, values may be removed but may not be
|
||
added or updated. The following methods will throw
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html" target="_top">UnsupportedOperationException</a>
|
||
|
||
when an index is used:
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html#add()" target="_top">Collection.add()</a>,
|
||
<span><a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#set()" target="_top">List.set()</a>,</span>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#set()" target="_top">ListIterator.set()</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html#setValue()" target="_top">Map.Entry.setValue()</a>.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html#entrySet()" target="_top">SortedMap.entrySet()</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html#keySet()" target="_top">SortedMap.keySet()</a>
|
||
|
||
return a
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedSet.html" target="_top">SortedSet</a>,
|
||
not just a
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Set.html" target="_top">Set</a>
|
||
|
||
as specified in Java collections interface. This allows using the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedSet.html" target="_top">SortedSet</a>
|
||
|
||
methods on the returned collection.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html#values()" target="_top">SortedMap.values()</a>
|
||
|
||
returns a
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedSet.html" target="_top">SortedSet</a>,
|
||
not just a
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html" target="_top">Collection</a>,
|
||
whenever the keys of the map can be derived from the values using
|
||
an entity binding. Note that the sorted set returned is not really
|
||
a set if duplicates are allowed, since it is technically a
|
||
collection; however, the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedSet.html" target="_top">SortedSet</a>
|
||
|
||
methods (for example, subSet()), can still be used.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
For
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedSet.html" target="_top">SortedSet</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html" target="_top">SortedMap</a>
|
||
|
||
views, additional subSet() and subMap() methods are provided that
|
||
allow control over whether keys are treated as inclusive or
|
||
exclusive values in the key range.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Keys and values are stored by value, not by reference. This is
|
||
because objects that are added to collections are converted to byte
|
||
arrays (by bindings) and stored in the database. When they are
|
||
retrieved from the collection they are read from the database and
|
||
converted from byte arrays to objects. Therefore, the object
|
||
reference added to a collection will not be the same as the
|
||
reference later retrieved from the collection.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
A runtime exception,
|
||
<a class="ulink" href="../../java/com/sleepycat/util/RuntimeExceptionWrapper.html" target="_top">RuntimeExceptionWrapper</a>,
|
||
is thrown whenever database exceptions occur which are not runtime
|
||
exceptions. The
|
||
<a class="ulink" href="../../java/com/sleepycat/util/RuntimeExceptionWrapper.html#getCause()" target="_top">RuntimeExceptionWrapper.getCause()</a>
|
||
|
||
method can be called to get the underlying exception.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
All iterators for stored collections implement the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html" target="_top">ListIterator</a>
|
||
|
||
interface as well as the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html" target="_top">Iterator</a>
|
||
|
||
interface. This is to allow use of the
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#hasPrevious()" target="_top">ListIterator.hasPrevious()</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#previous()" target="_top">ListIterator.previous()</a>
|
||
|
||
methods, which work for all collections
|
||
since Berkeley DB provides bidirectional cursors.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
All stored collections have a
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredCollection.html#iterator(boolean)" target="_top">StoredCollection.iterator(boolean)</a>
|
||
|
||
method that allows creating
|
||
a read-only iterator for a writable collection. For the standard
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html#iterator()" target="_top">Collection.iterator()</a>
|
||
|
||
method, the iterator is read-only only
|
||
when the collection is read-only.
|
||
|
||
<span>Read-only iterators are important
|
||
for using the Berkeley DB Concurrent Data Store environment, since
|
||
only one write cursors may be open at one time.</span>
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Iterator stability for stored collections is greater than the
|
||
iterator stability defined by the Java collections interfaces.
|
||
Stored iterator stability is the same as the cursor stability
|
||
defined by Berkeley DB.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
When an entity binding is used, updating (setting) a value is
|
||
not allowed if the key in the entity is not equal to the original
|
||
key. For example, calling
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html#put()" target="_top">Map.put()</a>
|
||
|
||
is not allowed when the key parameter is not equal to the key of
|
||
the entity parameter.
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.html#put()" target="_top">Map.put()</a>,
|
||
<span><a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#set()" target="_top">List.set()</a>,</span>
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#set()" target="_top">ListIterator.set()</a>,
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html#setValue()" target="_top">Map.Entry.setValue()</a>
|
||
|
||
will throw
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/IllegalArgumentException.html" target="_top">IllegalArgumentException</a>
|
||
|
||
in this situation.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Adding and removing items from stored lists is not allowed for
|
||
sublists. This is simply an unimplemented feature and may be
|
||
changed in the future. Currently for sublists the following
|
||
methods throw
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/UnsupportedOperationException.html" target="_top">UnsupportedOperationException</a>:
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#add()" target="_top">List.add()</a><code class="methodname">List.add()</code>,
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#remove()" target="_top">List.remove()</a><code class="methodname">List.remove()</code>,
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#add()" target="_top">ListIterator.add()</a>
|
||
|
||
and
|
||
<a class="ulink" href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/ListIterator.html#remove()" target="_top">ListIterator.remove()</a><code class="methodname">ListIterator.remove()</code>.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
The
|
||
|
||
<span>
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredList.html#append(java.lang.Object)" target="_top">StoredList.append(java.lang.Object)</a>
|
||
|
||
and
|
||
</span>
|
||
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredMap.html#append(java.lang.Object)" target="_top">StoredMap.append(java.lang.Object)</a>
|
||
|
||
extension method<span>s</span> allows
|
||
adding a new record with an automatically assigned key.
|
||
<span>
|
||
Record number assignment by the database itself is supported
|
||
for QUEUE, RECNO and RECNO-RENUMBER databases.
|
||
</span>
|
||
An application-defined
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/PrimaryKeyAssigner.html" target="_top">PrimaryKeyAssigner</a>
|
||
|
||
is used to assign the key value.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class="sect2" lang="en" xml:lang="en">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div>
|
||
<h3 class="title"><a id="WhyJavaCollections"></a>
|
||
Why Java Collections for Berkeley DB
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>
|
||
The Java collections interface was chosen as the best Java API
|
||
for DB given these requirements:
|
||
</p>
|
||
<div class="orderedlist">
|
||
<ol type="1">
|
||
<li>
|
||
<p>
|
||
Provide the Java developer with an API that is as familiar and
|
||
easy to use as possible.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Provide access to all, or a large majority, of the features of
|
||
the underlying Berkeley DB storage system.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Compared to the DB API, provide a higher-level API
|
||
that is oriented toward Java developers.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
For ease of use, support object-to-data bindings, per-thread
|
||
transactions, and some traditional database features such as
|
||
foreign keys.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Provide a thin layer that can be thoroughly tested and which
|
||
does not significantly impact the reliability and performance of
|
||
DB.
|
||
</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
<p>
|
||
Admittedly there are several things about the Java Collections
|
||
API that don't quite fit with DB or with any transactional
|
||
database, and therefore there are some new rules for applying the
|
||
Java Collections API. However, these disadvantages are considered
|
||
to be smaller than the disadvantages of the alternatives:
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="disc">
|
||
<li>
|
||
<p>
|
||
A new API not based on the Java Collections API could have been
|
||
designed that maps well to DB but is higher-level.
|
||
However, this would require designing an entirely new model. The
|
||
exceptions for using the Java Collections API are considered easier
|
||
to learn than a whole new model. A new model would also require a
|
||
long design stabilization period before being as complete and
|
||
understandable as either the Java Collections API or the DB
|
||
API.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
The ODMG API or another object persistence API could have been
|
||
implemented on top of DB. However, an object persistence
|
||
implementation would add much code and require a long stabilization
|
||
period. And while it may work well for applications that require
|
||
object persistence, it would probably never perform well enough for
|
||
many other applications.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="navfooter">
|
||
<hr />
|
||
<table width="100%" summary="Navigation footer">
|
||
<tr>
|
||
<td width="40%" align="left"><a accesskey="p" href="UsingCollectionsAPI.html">Prev</a> </td>
|
||
<td width="20%" align="center">
|
||
<a accesskey="u" href="collectionOverview.html">Up</a>
|
||
</td>
|
||
<td width="40%" align="right"> <a accesskey="n" href="SerializedObjectStorage.html">Next</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td width="40%" align="left" valign="top">
|
||
Using the DB Java Collections API
|
||
</td>
|
||
<td width="20%" align="center">
|
||
<a accesskey="h" href="index.html">Home</a>
|
||
</td>
|
||
<td width="40%" align="right" valign="top">
|
||
Serialized Object Storage
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</body>
|
||
</html>
|