Cool. I actually started prototyping something similar this morning,
with one difference that I am not defining a master server, but
rather making it peer-to-peer (where the ownership of the database is
transferred on demand between the applications). This will likely
reduce the throughput (as reassigning the ownership would require a
full shutdown), but hopefully address the need to handle dropped
connections.
Cayenne has a generic distributed EventManager (with pluggable
transports, JavaGroups being one supported option) that I can try for
this purpose. We'll see how that works.
Andrus
On Jun 29, 2006, at 11:07 AM, Bernt M. Johnsen wrote:
Hi Andrus!
After you left, we were playing around with the problem and were
thinking along the same lines as your second solution. Some peer-to-
peer
protocol or some multicast membership protocol (e.g. something like
JGroups http://www.jgroups.org/javagroupsnew/docs/index.html. I have
done similar stuff before, and with the proper library, it's not that
hard to implement) for group communication and voting for a master
(which would be the server). The system should distribute
information on
where the server is and put up local connection pools which should be
invalidated when the master dies. If the master dies another master is
voted for.
The application should be written with the proper catch/rollback/retry
cycles for transactions, since losing the connection as a transient
error in such a system. (We've been working with distributed databases
before, so this is just something you have to do when you're
starting to
distribute database usage).
Bernt & Olav
Andrus Adamchik wrote:
I've been looking for some time for a good embedded database that
would
work for desktop applications. Derby is ideal for that and I am
starting to use it more and more in various examples and
tutorials that
I am writing for Cayenne. But there is one feature that I am
missing in
Derby (or any other database for that matter) - an ability to
share the
same database between multiple desktop applications (or multiple VM
instances of the same Java application).
I asked this question the Derby folks from Sun at ApacheCon in Dublin
the other day and the answer was basically - run the network
server. In
other words db sharing and embedded mode are not compatible. So I
wonder what it would take to make it compatible?
Since we are talking desktop apps, the following conditions are at
play:
(a) all apps run on the same machine (but in different VMs)
(b) usually only one instance at a time would work with the database,
but other instances can occasionally access the db in the background
(no need to deal with massive concurrency)
(c) usually the database is small-to-medium size.
Any ideas? One possible solution is cloning the DB for each instance
and using multicast for peer-to-peer synchronization.
Another (more promising) is to do collaborative peer-to-peer
connection
pool (DataSource), so that when a client needs a local Derby
connection
it sends a multicast so that current lock owner in a different VM
can
finish its thing, shutdown Derby and release the lock. I wonder if
anyone have done that already?
Andrus
------------------------------
Andrus (aka Andrei) Adamchik
Cayenne Persistence Framework
Creator, Committer
http://incubator.apache.org/projects/cayenne.html
--
Bernt Marius Johnsen, Database Technology Group,
Staff Engineer, Technical Lead Derby/Java DB
Sun Microsystems, Trondheim, Norway