mirror of
https://github.com/berkeleydb/libdb.git
synced 2024-11-17 01:26:25 +00:00
678 lines
26 KiB
HTML
678 lines
26 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 the DB Java Collections API</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="collectionOverview.html" title="Appendix A. API Notes and Details" />
|
||
<link rel="next" href="UsingStoredCollections.html" title="Using Stored Collections" />
|
||
</head>
|
||
<body>
|
||
<div xmlns="" class="navheader">
|
||
<div class="libver">
|
||
<p>Library Version 11.2.5.2</p>
|
||
</div>
|
||
<table width="100%" summary="Navigation header">
|
||
<tr>
|
||
<th colspan="3" align="center">
|
||
Using the DB Java Collections API
|
||
</th>
|
||
</tr>
|
||
<tr>
|
||
<td width="20%" align="left"><a accesskey="p" href="collectionOverview.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="UsingStoredCollections.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="UsingCollectionsAPI"></a>
|
||
Using the DB Java Collections API
|
||
</h2>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="toc">
|
||
<dl>
|
||
<dt>
|
||
<span class="sect2">
|
||
<a href="UsingCollectionsAPI.html#UsingTransactions">
|
||
Using Transactions
|
||
</a>
|
||
</span>
|
||
</dt>
|
||
<dt>
|
||
<span class="sect2">
|
||
<a href="UsingCollectionsAPI.html#TransactionRollback">
|
||
Transaction Rollback
|
||
</a>
|
||
</span>
|
||
</dt>
|
||
<dt>
|
||
<span class="sect2">
|
||
<a href="UsingCollectionsAPI.html#SelectingAccessMethods">Selecting Access Methods</a>
|
||
</span>
|
||
</dt>
|
||
<dt>
|
||
<span class="sect2">
|
||
<a href="UsingCollectionsAPI.html#AccessMethodRestrictions">
|
||
Access Method Restrictions
|
||
</a>
|
||
</span>
|
||
</dt>
|
||
</dl>
|
||
</div>
|
||
<p>
|
||
An
|
||
|
||
<a class="ulink" href="../../java/com/sleepycat/db/Environment.html" target="_top">Environment</a>
|
||
|
||
manages the resources for one or more data stores. A
|
||
|
||
<a class="ulink" href="../../java/com/sleepycat/db/Database.html" target="_top">Database</a>
|
||
|
||
object
|
||
represents a single database and is created via a method on the
|
||
environment object.
|
||
|
||
<a class="ulink" href="../../java/com/sleepycat/db/SecondaryDatabase.html" target="_top">SecondaryDatabase</a>
|
||
|
||
objects represent an index associated with a primary database.
|
||
|
||
<span>
|
||
An access method must be chosen for each database and secondary
|
||
database.
|
||
</span>
|
||
|
||
Primary and secondary databases are then used to create stored
|
||
collection objects, as described in
|
||
<a class="xref" href="UsingStoredCollections.html" title="Using Stored Collections">
|
||
Using Stored Collections
|
||
</a>.
|
||
</p>
|
||
<div class="sect2" lang="en" xml:lang="en">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div>
|
||
<h3 class="title"><a id="UsingTransactions"></a>
|
||
Using Transactions
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>
|
||
Once you have an environment, one or more databases, and one or
|
||
more stored collections, you are ready to access (read and write)
|
||
stored data. For a transactional environment, a transaction must be
|
||
started before accessing data, and must be committed or aborted
|
||
after access is complete. The DB Java Collections API provides several
|
||
ways of managing transactions.
|
||
</p>
|
||
<p>
|
||
The recommended technique is to use the
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html" target="_top">TransactionRunner</a>
|
||
|
||
class along with your own implementation of the
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/TransactionWorker.html" target="_top">TransactionWorker</a>
|
||
|
||
interface.
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html" target="_top">TransactionRunner</a>
|
||
|
||
will call your
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/TransactionWorker.html" target="_top">TransactionWorker</a>
|
||
|
||
implementation class to perform the data access or work of the
|
||
transaction. This technique has the following benefits:
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="disc">
|
||
<li>
|
||
<p>
|
||
Transaction exceptions will be handled transparently and
|
||
retries will be performed when deadlocks are detected.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
The transaction will automatically be committed if your
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/TransactionWorker.html#doWork()" target="_top">TransactionWorker.doWork()</a>
|
||
|
||
method returns normally, or will be
|
||
aborted if <code class="methodname">doWork()</code> throws an exception.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
<code class="classname">TransactionRunner</code> can be used for non-transactional
|
||
environments as well, allowing you to write your application
|
||
independently of the environment.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<p>
|
||
If you don't want to use
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html" target="_top">TransactionRunner</a>,
|
||
the alternative is to use the
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html" target="_top">CurrentTransaction</a>
|
||
|
||
class.
|
||
</p>
|
||
<div class="orderedlist">
|
||
<ol type="1">
|
||
<li>
|
||
<p>
|
||
Obtain a CurrentTransaction instance by calling the
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html#getInstance(com.sleepycat.db.Environment)" target="_top">CurrentTransaction.getInstance</a>
|
||
|
||
method. The instance returned
|
||
can be used by all threads in a program.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
Use
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html#beginTransaction(com.sleepycat.db.TransactionConfig)" target="_top">CurrentTransaction.beginTransaction()</a>,
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html#commitTransaction()" target="_top">CurrentTransaction.commitTransaction()</a>
|
||
|
||
and
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html#abortTransaction()" target="_top">CurrentTransaction.abortTransaction()</a>
|
||
|
||
to directly begin, commit and abort transactions.
|
||
</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
<p>
|
||
If you choose to use CurrentTransaction directly you must handle
|
||
the
|
||
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DeadlockException.html" target="_top">DeadlockException</a>
|
||
|
||
exception and perform retries yourself. Also note that
|
||
CurrentTransaction may only be used in a transactional
|
||
environment.
|
||
</p>
|
||
<p>
|
||
The DB Java Collections API supports nested transactions. If
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html#run(com.sleepycat.collections.TransactionWorker)" target="_top">TransactionRunner.run(com.sleepycat.collections.TransactionWorker)</a>
|
||
|
||
or
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html#beginTransaction(com.sleepycat.db.TransactionConfig)" target="_top">CurrentTransaction.beginTransaction()</a>
|
||
,
|
||
is called while another transaction is active, a child transaction
|
||
is created. When
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/TransactionRunner.html#run(com.sleepycat.collections.TransactionWorker)" target="_top">TransactionRunner.run(com.sleepycat.collections.TransactionWorker)</a>
|
||
|
||
returns, or when
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html#commitTransaction()" target="_top">CurrentTransaction.commitTransaction()</a>
|
||
|
||
or
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/CurrentTransaction.html#abortTransaction()" target="_top">CurrentTransaction.abortTransaction()</a>
|
||
|
||
is called, the parent transaction becomes active again. Note that
|
||
because only one transaction is active per-thread, it is impossible
|
||
to accidentally use a parent transaction while a child transaction
|
||
is active.
|
||
</p>
|
||
<p>
|
||
The DB Java Collections API supports transaction auto-commit.
|
||
If no transaction is active and a write operation is requested for
|
||
a transactional database, auto-commit is used automatically.
|
||
</p>
|
||
<p>
|
||
The DB Java Collections API also supports transaction
|
||
dirty-read via the
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredCollections.html" target="_top">StoredCollections</a>
|
||
|
||
class. When dirty-read is enabled for a collection, data will be
|
||
read that has been modified by another transaction but not
|
||
committed. Using dirty-read can improve concurrency since reading
|
||
will not wait for other transactions to complete. For a
|
||
non-transactional container, dirty-read has no effect. See
|
||
<a class="ulink" href="../../java/com/sleepycat/collections/StoredCollections.html" target="_top">StoredCollections</a>
|
||
|
||
for how to create a dirty-read collection.
|
||
</p>
|
||
</div>
|
||
<div class="sect2" lang="en" xml:lang="en">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div>
|
||
<h3 class="title"><a id="TransactionRollback"></a>
|
||
Transaction Rollback
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>
|
||
When a transaction is aborted (or rolled back) the application
|
||
is responsible for discarding references to any data objects that
|
||
were modified during the transaction. Since the DB Java Collections API
|
||
treats data by value, not by reference, neither the data
|
||
objects nor the DB Java Collections API objects contain status
|
||
information indicating whether the data objects are 1- in sync with
|
||
the database, 2- dirty (contain changes that have not been written
|
||
to the database), 3- stale (were read previously but have become
|
||
out of sync with changes made to the database), or 4- contain
|
||
changes that cannot be committed because of an aborted
|
||
transaction.
|
||
</p>
|
||
<p>
|
||
For example, a given data object will reflect the current state
|
||
of the database after reading it within a transaction. If the
|
||
object is then modified it will be out of sync with the database.
|
||
When the modified object is written to the database it will then be
|
||
in sync again. But if the transaction is aborted the object will
|
||
then be out of sync with the database. References to objects for aborted
|
||
transactions
|
||
should no longer be used. When these objects are needed later they
|
||
should be read fresh from the database.
|
||
</p>
|
||
<p>
|
||
When an existing stored object is to be updated, special care
|
||
should be taken to read the data, then modify it, and then write it
|
||
to the database, all within a single transaction. If a stale data
|
||
object (an object that was read previously but has since been
|
||
changed in the database) is modified and then written to the
|
||
database, database changes may be overwritten unintentionally.
|
||
</p>
|
||
<p>
|
||
When an application enforces rules about concurrent access to
|
||
specific data objects or all data objects, the rules described here
|
||
can be relaxed. For example, if the application knows that a
|
||
certain object is only modified in one place, it may be able to
|
||
reliably keep a current copy of that object. In that case, it is
|
||
not necessary to reread the object before updating it. That said,
|
||
if arbitrary concurrent access is to be supported, the safest
|
||
approach is to always read data before modifying it within a single
|
||
transaction.
|
||
</p>
|
||
<p>
|
||
Similar concerns apply to using data that may have become stale.
|
||
If the application depends on current data, it should be read fresh
|
||
from the database just before it is used.
|
||
</p>
|
||
</div>
|
||
<div class="sect2" lang="en" xml:lang="en">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div>
|
||
<h3 class="title"><a id="SelectingAccessMethods"></a>Selecting Access Methods</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>
|
||
For each data store and secondary index, you must choose from one of the
|
||
access methods in the table below.
|
||
|
||
The access method determines not only whether sorted keys or duplicate
|
||
keys are supported, but also what types of collection views may be used
|
||
and what restrictions are imposed on the collection views.
|
||
</p>
|
||
<div class="informaltable">
|
||
<table border="1" width="80%">
|
||
<colgroup>
|
||
<col />
|
||
<col />
|
||
<col />
|
||
<col />
|
||
<col />
|
||
<col />
|
||
</colgroup>
|
||
<thead>
|
||
<tr>
|
||
<th>Access Method</th>
|
||
<th>Ordered</th>
|
||
<th>Duplicates</th>
|
||
<th>Record Numbers</th>
|
||
<th>Database Type</th>
|
||
<th><code class="classname">DatabaseConfig</code> Method</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>
|
||
BTREE-UNIQUE
|
||
</td>
|
||
<td>
|
||
Yes
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#BTREE" target="_top">BTREE</a>
|
||
|
||
</td>
|
||
<td>
|
||
None
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
BTREE-DUP
|
||
</td>
|
||
<td>
|
||
Yes
|
||
</td>
|
||
<td>
|
||
Yes, Unsorted
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#BTREE" target="_top">BTREE</a>
|
||
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseConfig.html#setUnsortedDuplicates(boolean)" target="_top">setUnsortedDuplicates</a>
|
||
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
BTREE-DUPSORT
|
||
</td>
|
||
<td>
|
||
Yes
|
||
</td>
|
||
<td>
|
||
Yes, Sorted
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#BTREE" target="_top">BTREE</a>
|
||
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseConfig.html#setSortedDuplicates(boolean)" target="_top">setSortedDuplicates</a>
|
||
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
BTREE-RECNUM
|
||
</td>
|
||
<td>
|
||
Yes
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
Yes, Renumbered
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#BTREE" target="_top">BTREE</a>
|
||
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseConfig.html#setBtreeRecordNumbers(boolean)" target="_top">setBtreeRecordNumbers</a>
|
||
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
HASH-UNIQUE
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#HASH" target="_top">HASH</a>
|
||
|
||
</td>
|
||
<td>
|
||
None
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
HASH-DUP
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
Yes, Unsorted
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#HASH" target="_top">HASH</a>
|
||
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseConfig.html#setUnsortedDuplicates(boolean)" target="_top">setUnsortedDuplicates</a>
|
||
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
HASH-DUPSORT
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
Yes, Sorted
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#HASH" target="_top">HASH</a>
|
||
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseConfig.html#setSortedDuplicates(boolean)" target="_top">setSortedDuplicates</a>
|
||
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
QUEUE
|
||
</td>
|
||
<td>
|
||
Yes
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
Yes, Fixed
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#QUEUE" target="_top">QUEUE</a>
|
||
|
||
</td>
|
||
<td>
|
||
None
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
RECNO
|
||
</td>
|
||
<td>
|
||
Yes
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
Yes, Fixed
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#RECNO" target="_top">RECNO</a>
|
||
|
||
</td>
|
||
<td>
|
||
None
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
RECNO-RENUMBER
|
||
</td>
|
||
<td>
|
||
Yes
|
||
</td>
|
||
<td>
|
||
No
|
||
</td>
|
||
<td>
|
||
Yes, Renumbered
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseType.html#RECNO" target="_top">RECNO</a>
|
||
|
||
</td>
|
||
<td>
|
||
<a class="ulink" href="../../java/com/sleepycat/db/DatabaseConfig.html#setRenumbering(boolean)" target="_top">setRenumbering</a>
|
||
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<p>
|
||
Please see
|
||
<span class="html"><a class="ulink" href="../../programmer_reference/am_conf.html#am_conf_intro" target="_top">Available Access Methods</a> in</span>
|
||
the <em class="citetitle">Berkeley DB Programmer's Reference Guide</em>
|
||
for more information on access method configuration.
|
||
</p>
|
||
</div>
|
||
<div class="sect2" lang="en" xml:lang="en">
|
||
<div class="titlepage">
|
||
<div>
|
||
<div>
|
||
<h3 class="title"><a id="AccessMethodRestrictions"></a>
|
||
Access Method Restrictions
|
||
</h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>
|
||
The restrictions imposed by the access method on the database
|
||
model are:
|
||
</p>
|
||
<div class="itemizedlist">
|
||
<ul type="disc">
|
||
<li>
|
||
<p>
|
||
If keys are ordered then data may be enumerated in key order and
|
||
key ranges may be used to form subsets of a data store. The
|
||
<code class="classname">SortedMap</code> and <code class="classname">SortedSet</code>
|
||
interfaces are supported for collections with ordered keys.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
If duplicates are allowed then more than one value may be
|
||
associated with the same key. This means that the data store cannot
|
||
be strictly considered a map — it is really a multi-map. See
|
||
<a class="xref" href="UsingStoredCollections.html" title="Using Stored Collections">
|
||
Using Stored Collections
|
||
</a>
|
||
for implications on the use of the collection interfaces.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
If duplicate keys are allowed for a data store then the data
|
||
store may not have secondary indices.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
For secondary indices with duplicates, the duplicates must be
|
||
sorted. This restriction is imposed by the DB Java Collections API.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
With sorted duplicates, all values for the same key must be
|
||
distinct.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
If duplicates are unsorted, then values for the same key must be
|
||
distinct.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
If record number keys are used, the the number of records is
|
||
limited to the maximum value of an unsigned 32-bit integer.
|
||
</p>
|
||
</li>
|
||
<li>
|
||
<p>
|
||
If record number keys are renumbered, then standard List
|
||
add/remove behavior is supported but concurrency/performance is
|
||
reduced.
|
||
</p>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<p>
|
||
See
|
||
<a class="xref" href="UsingStoredCollections.html" title="Using Stored Collections">
|
||
Using Stored Collections
|
||
</a>
|
||
for more information on how access methods impact the use of stored
|
||
collections.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="navfooter">
|
||
<hr />
|
||
<table width="100%" summary="Navigation footer">
|
||
<tr>
|
||
<td width="40%" align="left"><a accesskey="p" href="collectionOverview.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="UsingStoredCollections.html">Next</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td width="40%" align="left" valign="top">Appendix A.
|
||
API Notes and Details
|
||
</td>
|
||
<td width="20%" align="center">
|
||
<a accesskey="h" href="index.html">Home</a>
|
||
</td>
|
||
<td width="40%" align="right" valign="top">
|
||
Using Stored Collections
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</body>
|
||
</html>
|