Re: JournalDiskSyncStrategy?
Karl Wettin <[email protected]> Tue, 12 Aug 2014 19:48:32 +0200
| Newsgroups | gmane.comp.java.prevayler |
|---|---|
| Message-ID | <[email protected]> |
My suggestion: https://github.com/jsampson/prevayler/pull/9 On 11 Aug 2014, at 21:53, Justin Sampson <[email protected]> wrote: > Karl Wettin wrote: > >> What I do is to place a transient object graph of a given root >> object on a queue which is polled by a single thread which >> evaluate the delta which produce and execute transactions. >> Sometimes as many as 200 transaction from a single delta. >> >> Usually I manage to empty this queue a every few seconds when >> not syncing on each transaction. It would be nice to sync at >> that point. >> >> Running FS.sync on each and every transaction produced from the >> delta of a transient root object graph takes up to 10 seconds >> on my slow HDD, usually 5-7, while not syncing takes 1-3 >> milliseconds. > > Oh, interesting. Prevayler tries to batch multiple transactions > into a single disk sync, but the current implementation is > thread-based: The number of transactions per batch is bounded by > the number of threads that are submitting transactions. You > probably don't want to create 200 threads just to submit those > 200 transactions. > > If the Prevayler interface were redesigned to be asynchronous, > you could submit all 200 transactions without waiting for them to > complete, and Prevayler could take care of batching them for you. > Unfortunately that would require some nontrivial redesign of > Prevayler's internals. > > A less drastic change would be to add a single new method to the > Prevayler interface, e.g.: > > void executeAll(Iterable<? extends Transaction<? super P>>) > > The implementation could then ensure that all of the given > transactions get batched into a single disk sync. > > For that matter, even without any changes to Prevayler, you could > combine your 200 individual transactions into a single composite > transaction with the same effect, e.g.: > > public final class CompositeTransaction<P> > implements Transaction<P>, Serializable { > private final List<Transaction<P>> transactions; > public CompositeTransaction( > Collection<? extends Transaction<P>> transactions) { > this.transactions = new ArrayList<>(transactions); > } > public void executeOn(P prevalentSystem, Date executionTime) { > for (Transaction<P> transaction : transactions) { > transaction.executeOn(prevalentSystem, executionTime); > } > } > } > > Since you're not actually wanting to turn off disk sync, just > make it more efficient, one of these options might be preferable > to making the disk sync logic itself more configurable. > > Cheers, > Justin > > ------------------------------------------------------------------------------ > _______________________________________________ > To unsubscribe go to the end of this page: http://lists.sourceforge.net/lists/listinfo/prevayler-discussion > _______________________________________________ > "Databases in Memoriam" -- http://www.prevayler.org ------------------------------------------------------------------------------ _______________________________________________ To unsubscribe go to the end of this page: http://lists.sourceforge.net/lists/listinfo/prevayler-discussion _______________________________________________ "Databases in Memoriam" -- http://www.prevayler.org