Ok, ho scavato un po' e l'ho capito da solo. (Grazie per le tante persone gentili sulla mailing list degli utenti Tomcat!)
JB Nizet ha ragione:se stai creando pool di connessione al database Tomcat dal codice Java, ogni DataSource che istanzia letteralmente è/rappresenta un pool di connessione separato. Questo è stato sorprendente per me; provenendo da uno sfondo .NET, ho ipotizzato che il pool di connessioni Tomcat avrebbe funzionato come il pool di connessioni SqlServer/ADO.NET:se si utilizzano due stringhe di connessione identiche per ottenere due connessioni al database, queste proverranno entrambe dallo stesso pool di connessioni. Tuttavia, in Tomcat, quando si istanziano oggetti DataSource dal codice Java, ogni nuova istanza DataSource è un pool di connessioni completamente nuovo. Pertanto, se si desidera mantenere questi pool di connessioni tra le chiamate del servizio Web JAX-RS, ad esempio, è necessario creare la propria cache del pool di database (DataSource), inserire le istanze DataSource (una per database) e archiviarla in un oggetto che JAX-RS persisterà tra le chiamate al servizio Web. L'ho appena fatto e funziona bene.
a proposito, il pool di connessioni al database Tomcat offre funzionalità simili al pool di connessioni SqlServer/ADO.NET, devi solo utilizzare le risorse JNDI per creare le tue istanze DataSource. (Nel mio caso questa non è un'opzione, poiché i database vengono creati dinamicamente nella mia applicazione e le definizioni JNDI vengono generalmente create da file di configurazione che Tomcat legge all'avvio.)