here’s the situation.
In a Java Web App i was assigned to mantain, i’ve been asked to improve the general response time for the stress tests during QA. This web app doesn’t use a database, since it was supposed to be light and simple. (And i can’t change that decision)
To persist configuration, i’ve found that everytime you make a change to it, a general object containing lists of config objects is serialized to a file.
Using Jmeter i’ve found that in the given test case, there are 2 requests taking up the most of the time. Both these requests add or change some configuration objects. Since the access to the file must be sinchronized, when many users are changing config, the file must be fully written several times in a few seconds, and requests are waiting for the file writing to happen.
I have thought that all these serializations are not necessary at all, since we are rewriting the most of the objects again and again, the changes in every request are to one single object, but the file is written as a whole every time.
So, is there a way to reduce the number of real file writes but still guarantee that all changes are eventually serialized?
Any suggestions appreciated
One option is to do changes in memory and keep one thread on the background, running at given intervals and flushing the changes to the disk. Keep in mind, that in the case of crash you’ll lost data that wasn’t flushed.
The background thread could be scheduled with a ScheduledExecutorService.
IMO, it would be better idea to use a DB. Can’t you use an embedded DB like Java DB, H2 or HSQLDB? These databases support concurrent access and can also guarantee the consistency of data in case of crash.