Hi all
Let me describe my problem. We have implemented a servlet (deployed in tomcat) that takes a REST request and based on its query parameters, it builds and executes a single query (using Hibernate ORM) within a JTA transaction (using Atomikos). The application specifics are not important, what is important is that we need high throughput (15.000 trx / sec is our objective).
We have implemented all infrastructure code using Qi4j for COP and DI as well as Property<T> data validation (constraint annotations). In deployment time (in a separate thread) we assemble and activate two Qi4j runtimes, each with a Qi4j application. The first is used only during deployment, while the second is used in ALL threads that serve requests. Using Qi4j this second application, starts various ServiceComposite while the servlet deployes, for eager initialization (logger service, mapping service, repository service, rest service, application services, domain services, transaction service, token service to name only some). We implement our Use Cases with a DCI design.
These services and DCI code uses various ValueBuilder<T> and TransientBuilder<T> to do composition.
The problem is:
Because ALL request threads, use the same Qi4j application, we have various race conditions that are mainly associated with the various builders. These race conditions appear when the servlet serves more that 2000 trx / sec. Sacrificing some throughput we can synchronize shared variables, but to minimize performance impact we need to know:
1. What is the best practice for such cases
2. Which part of ValueBuilderFactory, ValueBuilder<T>, TransientBuilderFactory, TransientBuilder<T> is best to synchronize?
Thanx in advance