Hazelcast - In-Memory Data Grid for Java
code.google.com
code.google.com
Another project to look into is JBoss's recently re-branded and improved cache:
http://www.jboss.org/infinispan
I've been thinking about a problem lately that will likely require one of these technologies, so I've been especially curious.
So, you write DAOs that "persist" to a queue and to a shared map(s). When you read, you look in the map first and go to the DB upon failure. Queue consumers persist messages (inserts/updates) to the db. After your application reaches a steady state, you shouldn't have to read from the DB much at all. And, you could build an eager loading mechanism for efficient start-up.
Even without async persistence, I'd prefer one of these solutions over memcached/MySQL replication hackery.