In the majority of production situations it is desirable to have a level of failover between
the underlying datastores used for persistence. You have at least 2 options available to you
here. These are shown below
Sequoia is a transparent
middleware solution offering clustering, load balancing and failover services for any
database. Sequoia is the continuation of the C-JDBC project. The database is distributed
and replicated among several nodes and Sequoia balances the queries among these nodes.
Sequoia handles node and network failures with transparent failover. It also provides
support for hot recovery, online maintenance operations and online upgrades.
Sequoia can be used with DataNucleus by just providing the Sequoia datastore URLs as input
to DataNucleus.
There is a problem outstanding in Sequoia itself in that its JDBC driver
doesnt provide DataNucleus with the correct major/minor versions of the underlying
datastore. Until Sequoia fix this issue, use of Sequoia will be unreliable
DataNucleus has the capability to switch to between DataSources upon failure of one while
obtaining a datastore connection. The failover mechanism is useful for applications with
multiple database nodes when the data is actually replicated/synchronized by the underlying
database. There are 2 things to be aware of before utilising this functionality.
-
DataNucleus doesn't replicate changes to all database nodes, and for this reason, this
feature is suggested to be used only for reading objects or if the database is capable
to replicate the changes to all nodes.
-
If a connection breaks while in use the failover mechanism will not handle it, thus the
user application must take care of restarting the transaction and execute the operations.
Several failover algorithm are allowed to be used, one at time, as for example
round-robin
,
ordered list
or
random
. The default algorithm, ordered
list, is described below and is provided by DataNucleus. You can also implement and plug
your own algorithm.
See Connection Provider.
To use failover, each datastore connection must be provided through DataSources. The
datanucleus.ConnectionFactoryName
property must be declared with a list of JNDI names
pointing to DataSources, in the form of
<JNDINAME> [,<JNDINAME>]
. See
the example:
datanucleus.ConnectionFactoryName=JNDINAME1,JNDINAME2
At least one least one JNDI name must be declared.
The
Ordered List Algorithm (default)
allows you to switch to slave DataSources upon
failure of a master DataSource while obtaining a datastore connection. This is shown below.
Each time DataNucleus needs to obtain a connection to the datastore, it takes the first
DataSource, the Master, and tries, on failure to obtain the connection goes to the next on
the list until it obtains a connection to the datastore or the end of the list is reached.
The first JNDI name in the
datanucleus.ConnectionFactoryName
property is the Master
DataSource and the following JNDI names are the Slave DataSources.