Lors de l'appel de l'API REST Spring Boot plusieurs fois en utilisant la même connexion JDBC
P粉769045426
2023-08-27 09:40:00
<p>J'ai un service Web REST écrit en Java/Spring Boot, fonctionnant sur Tomcat 9. </p>
<p>Je dois créer une table temporaire MySQL lors d'un appel de service Web et y accéder lors d'un autre appel de service. Étant donné que la table temporaire est limitée à la connexion, je dois utiliser la même connexion que celle que j'ai utilisée lors de la création de la table lors du premier appel et dans la requête "select" lors du deuxième appel. </p>
<p>Le problème est que Tomcat gère les connexions JDBC dans un pool de connexions. Lors du deuxième appel de service, quel que soit le nombre de connexions JDBC que je crée, je peux sélectionner n'importe quelle connexion dans le pool de connexions. Dans ce cas, la table temporaire ne sera pas visible. </p>
<p>Ma question est la suivante : Comment puis-je sélectionner la même connexion dans le pool de connexions ? Existe-t-il une sorte de logo/label qui les différencie ? </p>
Même si vous pouviez vous assurer que la « même » connexion est utilisée lors des requêtes ultérieures, cela n'aidera pas car une partie de l'allocation d'une connexion à partir du pool implique de réinitialiser les éléments liés à l'état de la session.
C'est intentionnel et c'est une bonne chose, car sinon vous pourriez divulguer des données privées d'une session de base de données vers une autre session sans rapport. Par exemple, cela poserait un problème si un utilisateur stockait des données sensibles dans une table temporaire et que la session de base de données d'un autre utilisateur pouvait lire cette table temporaire. Il en va de même pour les transactions en attente, les variables de session et les jeux de caractères de connexion. Tous ces éléments sont réinitialisés lorsqu’une connexion est allouée à partir du pool.
Donc, si vous utilisez des tables temporaires, vous ne devez les utiliser que lors de la même requête car elles seront supprimées une fois la connexion utilisée.
Si vous devez utiliser les données de la requête précédente dans la requête suivante, vous pouvez :