Comment arrêter Derby de base de données en mémoire correctement
-
22-09-2019 - |
Question
J'utilise derby comme base de données intégrée. De plus, je l'utilise est l'option de base de données en mémoire pour mes tests unitaires.
Ce que je ne peux pas comprendre est comment arrêter correctement vers le bas (Un rapide regarder le code) la base de données Derby. Je beleive que je l'ai travaille pour une base de données standard, mais j'obtiens différentes exceptions lorsque tentative code similaire sur une base de données en mémoire.
Je vais omettre les détails, je vais les ajouter si d'autres que vous jugez nécessaire.
En fait, je suis en train de fermer ma base de données dans ces deux modes où ma base de données en mémoire est appelée constamment « eh »:
DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");
alors:
DriverManager.getConnection("jdbc:derby:eh;shutdown=true");
Les anciens résultats dans une exception, mais pas celui attendu . Les détails sont les suivants:
java.sql.SQLNonTransientConnectionException: Base de données 'mémoire: eh'. Arrêt
Ces derniers résultats en
java.sql.SQLException: Database 'eh' not found
.
D'après ce que je suis en mesure de comprendre, nous voulons un SQLException
mais pas celui que nous recevons. D'autre part, l'erreur de SQLNonTransientConnectionException
semble plus approprié, mais n'est pas le bon type (bien qu'il soit dérivé de SQLException
) n'a pas non plus le bon code d'état. La fin code d'état jusqu'à être. 08006
Le code exemple je montre qu'un SQLException
avec un état SQL de "XJ015".
Note: L'exemple que je fais référence est le suivant: WwdEmbedded Programme ( du code Java ).
La solution
XJ015 (avec SQLCODE
50000) est prévu (avec succès) SQLSTATE
pour l'arrêt complet du système. 08006 (avec SQLCODE
45000), d'autre part, est le SQLSTATE
prévu pour l'arrêt de seulement une base de données individuelle.
DriverManager.getConnection("jdbc:derby:;shutdown=true");
arrête le système tout entier et devrait entraîner XJ015
.
Autres conseils
L'URL « jdbc: derby: mémoire: eh, arrêt = true » dans les résultats les attendus 08006 code d'erreur, mais ne supprime pas réellement la DB de la mémoire. Si plus tard, vous essayez de créer une nouvelle base de données avec « jdbc: derby: mémoire: eh, créer = true », vous obtiendrez une erreur indiquant que la base de données existe déjà
.Heureusement, comme de Derby 10.6.1.0 (publié le 17 mai 2010), il est possible de déposer effectivement une base de données en mémoire à l'aide d'une URL de la forme "jdbc: derby: mémoire: eh, drop = true" . Voir notes de version et la page en utilisant les bases de données en mémoire .
Je crois que votre premier exemple de code est très bien. La différence SQL État que vous voyez, je crois, parce que vous utilisez Derby embedded, mais l'exemple de code que vous avez vu (avec l'état SQL XJ015) fonctionnait dans une configuration client-serveur.
Comme vous l'avez dit, le SQLNonTransientConnectionException est une sous-classe de SQLException, donc je suis confus quant à pourquoi vous pensez que vous ne recevez pas le bon type d'exception.