Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are synchronizing strategies for Prevayler?

Tags:

Prevayler guarantees that all the writes ( through its transactions) are synchronized. But what about reads?

Is it right that dirty reads are possible if no explicit synchronizing is used (in user code)?

Are they possible if a business object is read as:

// get the 3rd account
Accont account = (Bank)prevayler.prevalentSystem().getAccounts().get(2);

?

If so what synchronizing strategies are good for a user code?

(Consider a business object A contains a collection of business objects Bs),

  • using a synchronized collection (of Bs inside of A), for example from java.util.concurrent package?
  • synchronize collection reads outside transactions with the collection writes inside transactions, for example using "synchronized( collection )" code around reads and writes?
like image 331
Sergey Avatar asked Jan 17 '09 23:01

Sergey


1 Answers

The recommended way is to use JMatch Query and Prevayler.execute(Query). Either directly or by using subclassing.

The returned results must be either primitive values or immutable objects. If you plan to return mutable objects you should subclass JMatch Query to do these deep copies. This way you get a system that locks every sensible read with other (sensible) reads and writes. This can speed up and simplify development, especially for developers without multithreaded programming expirience.

If you need more performance under high concurrent load, which is supposed to be a rare case, you indeed can use described above fine grained locking - using "synchronized" and java.util.concurrent.

See this discussion for more details.

like image 94
Sergey Avatar answered Sep 30 '22 16:09

Sergey