The goal of the API is to provide a productive environment for creating 
database applications; the goal of the SPI is to make it easy to provide 
those applications with some backend database adapter.  We mean to 
describe a simple set of abstractions and then to state that if you implement
them as described, your adapter will work without surprises.

Concepts
--------

1. DBServiceProvider
  
   DBServiceProvider is able to do a few crucial things.
    * Supply the list of prerequisite modules required for the adapter to function
    * Supply a set of default connection properties
    * Given a set of connection properties, return a DBConnectionPool
    * Given a set of properties, return a string factoryKey. 
      If two sets of properties result in the same factoryKey, then they can 
      use the same DBConnectionPool.


2. DBConnectionPool 

   DBConnectionPool is able to open and close a "master" connection (or pool
   of connections) to the database.
   
   Most importantly, DBConnectionPool implements getDBSession().  While the 
   DBConnectionPool itself represents a master connection for, say, a whole
   web application, the DBSession represents an individual session for an 
   individual user's request.  
   
   DBConnectionPool is also responsible for some data dictionary operations.
   It implements the two fundamental data dictionary lookups, listTables() 
   and getTableMetadata().  And, finally, it implements 
   registerTypeConverter(), which can establish a default conversion between
   a SQL type anywhere in the database (such as BIGINT) and some JavaScript
   class (such as a BigInteger utility class).
   

3. DBSession

   A DBSession encapsulates a user's session and one single active database
   transaction in that session.  DBSession implements a Builder pattern, 
   allowing various operations to be built and then executed.  

  
4. DBOperation

   DBOperation encapsulates a particular database operation, including the 
   details that define it (such as search keys and lock mode), its indexed 
   access path, its result, and any errors encountered during its execution.


5. DBTableHandler 

   DBTableHandler encapsulates the relationship between a DBTable -- which is a 
   metadata object obtained from the data dictionary -- and a class of domain
   objects mapped to that table. 
   