Re: JournalDiskSyncStrategy?
Karl Wettin <[email protected]> Tue, 12 Aug 2014 19:50:08 +0200
| Newsgroups | gmane.comp.java.prevayler |
|---|---|
| Message-ID | <[email protected]> |
By the way, I have no clue how to write a test case for this new code. I'm all ears if someone has a clue. On 12 Aug 2014, at 19:48, Karl Wettin <[email protected]> wrote: > 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