We are not interested in JBoss AS Clustering as we have a stateless application but we want to balance the load, as we are expecting heavy peak load.
So the application is deployed in multiple standalone JBoss intsnaces, in a non-clustered and balanced fashion.
I want to cache database queries (or entities) and want that local L2 caches in every JBoss instance to be automatically synced.
"JBoss AS Clustering" is not a monolithic feature. You can replicate any part of your server-side state without having to replicate everything.
Automatically syncing your L2 cache *is* a clustering feature - and you can enable it, on a per-entity/collection/query basis without having to replicate everything. The cost of group communication is negligible - the real limiting factor is the amount of state coordination between nodes.
Given that performance is a concern, I would strongly encourage you to leverage JPA with an 2nd-level invalidation cache. With an invalidation-cache, entity state is not replicated between nodes, but is local only. However, any database write affecting cached entities will result in the broadcast of invalidation messages (which only contain the primary key, not the entity state itself) to your other nodes - to inform caches on other nodes that they need to refresh any corresponding cached entities from the database. Be conservative about which entities/queries you want to cache - since this kind of caching only scales well when the number of writes for a given entity is small compared to the number of reads.