summaryrefslogtreecommitdiff
path: root/docs/collections/tutorial/UsingCollectionsAPI.html
diff options
context:
space:
mode:
authorLorry <lorry@roadtrain.codethink.co.uk>2012-07-20 20:00:05 +0100
committerLorry <lorry@roadtrain.codethink.co.uk>2012-07-20 20:00:05 +0100
commit3ef782d3745ea8f25a3151561a3cfb882190210e (patch)
tree86b9c2f5fde051dd0bced99b3fc9f5a3ba08db69 /docs/collections/tutorial/UsingCollectionsAPI.html
downloadberkeleydb-3ef782d3745ea8f25a3151561a3cfb882190210e.tar.gz
Tarball conversion
Diffstat (limited to 'docs/collections/tutorial/UsingCollectionsAPI.html')
-rw-r--r--docs/collections/tutorial/UsingCollectionsAPI.html678
1 files changed, 678 insertions, 0 deletions
diff --git a/docs/collections/tutorial/UsingCollectionsAPI.html b/docs/collections/tutorial/UsingCollectionsAPI.html
new file mode 100644
index 00000000..77f30543
--- /dev/null
+++ b/docs/collections/tutorial/UsingCollectionsAPI.html
@@ -0,0 +1,678 @@
+<?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.3</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>