How to close all connections in HSQLDB (also prevents a locking defect) Comment fermer toutes les connexions dans HSQLDB (empêche également un défaut de verrouillage)
I have noticed that despite closing all connections and exiting a standalone HSQLDB database, at least one connection still remains open. J'ai remarqué que, malgré la fermeture de toutes les connexions et la sortie d'une base de données HSQLDB autonome, au moins une connexion reste ouverte.
The defect is manifested in HSQLDB 1.7.3 and HSQLDB 1.8.0 RC 8. Le défaut est manifesté dans HSQLDB 1.7.3 et HSQLDB 1.8.0 RC 8.
If you compile and run the sample code below, it will run fine for the first time. Si vous compiler et d'exécuter l'exemple de code ci-dessous, il marche très bien pour la première fois. Second time (if it is run immediately after the first time say within 2-3 seconds after completion of first execution) it fails everytime citing a database locked exception! Deuxième temps (si elle s'exécute immédiatement après la première fois dire au sein de 2-3 secondes après l'achèvement de la première exécution), il échoue à chaque fois en citant une base de données sans littoral exception!
Filed under Classé sous How To Comment , Java Software Logiciel de Java , RDBMS SGBDR | |
| |
RSS 2.0 RSS 2,0 | |
Email this Article Envoyer cet article
You may also like to read Vous mai également à lire |




March 11th, 2005 at 10:40 am Mars 11, 2005 at 10:40 am
No. This is not a defect. Non, ce n'est pas un défaut.
I did an extensive analysis and wrote the current hsqldb lock file and priority timer queue implementation: I disagree with your analysis. Je n'ai une analyse approfondie et a écrit la HSQLDB fichier de verrouillage et la priorité à rebours file d'attente de la mise en œuvre: je suis en désaccord avec votre analyse.
HSQLDB is now like Oracle or MySQL, et al: to correctly shut down the database, you must explicitly issue a command as an admin user. HSQLDB est maintenant comme Oracle ou MySQL, et al: à fermer correctement la base de données, vous devez envoyer une commande comme un utilisateur admin. (”SHUTDOWN …”). ( "FERMETURE…").
The main difference is that, unlike Oracle/MySQL, etc., which are fairly rigidly “single installation per machine/release version/data file set” products, it has been observed much more likely that maybe serveral HSQLDB installations/running JVM instances on a machine and each may attempt to access a specific database file set. La principale différence est que, contrairement à Oracle / MySQL, etc, qui sont assez rigide "seule installation par machine / version / fichier de données en fonction" des produits, il a été observé beaucoup plus probable que peut-être serveral HSQLDB installations / l'exécution de JVM sur des cas une machine à mai et chaque tentative d'accès à un fichier de base de données spécifiques fixés.
That is, we have the problem msaccess had (has?), when the database files were (are?) on a network drive and accessed by several different client machines simultaneously. C'est, nous avons le problème a Msaccess (a?), Lorsque les fichiers de base de données étaient (sont?) Sur un lecteur réseau et d'y accéder par plusieurs ordinateurs clients simultanément.
But our problem is even more likely to occur, because Java does not provide a shared-mem/ipc ODBC connection manager that allows multiple JVM processes to acccess the same local database file (unless you use the JDBC/ODBC driver, which is not available to type 4 implementations, without writing JNI layer) Mais notre problème est d'autant plus susceptible de se produire, parce que Java ne fournit pas une shared-mem/ipc gestionnaire de connexion ODBC qui permet à plusieurs processus de JVM acccess la même base de données locale des fichiers (sauf si vous utilisez JDBC / pilote ODBC, qui n'est pas disponible à la mise en œuvre de type 4, écrit sans couche JNI)
Anyway, if you abort the JVM (ctrl-c), kill, etc., or for any other reason the JVM dies abruptly, does a halt() (or even exit() on older JDKS where deleteOnExit is not available), then sure… the .lck file does not get deleted. Quoi qu'il en soit, si vous interrompez la JVM (ctrl-c), de tuer, etc, ou pour toute autre raison, la JVM meurt brusquement, fait un arrêt () (ou même la sortie () sur les anciennes JDK où deleteOnExit n'est pas disponible), puis Assurez-vous… l'. lck fichier ne sont pas supprimés.
In the next release or so, we will auto-detect availability of shutdownHook and add handler there, but this still will not help of true JVM abends. Dans la prochaine version ou l'affirmative, nous détectera automatiquement la disponibilité de shutdownHook gestionnaire et d'ajouter, mais cela ne permettra pas de vrai JVM abends.
But back to the point: if the .lck file does not get deleted, then there’sa 10 second buffer zone because the lock file is touched at 10 second intervals. Mais revenons au point: si l'. Lck fichier ne sont pas supprimés, puis 10 il ya un deuxième zone tampon parce que le fichier verrou est touché à 10 secondes d'intervalle.
I chose this number so that in cases where there is really heavy CPU and disk usage going on, there’sa fairly safe buffer zone: Java and most operating systems do not do really accurate timing, especially under high load. J'ai choisi ce nombre de façon que dans les cas où il est vraiment lourd processeur et du disque en cours, il ya assez de sécurité zone tampon: Java et la plupart des systèmes d'exploitation ne font pas vraiment la gestion du temps, en particulier sous haute charge. Just think about the case of a really high res, high frame-rate video with high bit-rate audio on a file) does not constitute an OS-enforced cross-process lock on the file. Il suffit de penser sur le cas d'une très haute résolution, haute-cadre avec les taux de vidéo à haut débit audio sur un fichier) ne constitue pas un OS-croix-forcée processus de verrouillage sur le fichier.
April 4th, 2005 at 3:30 pm Le 4 avril 2005 à 3:30 pm
@Campbell @ Campbell
Thanks for your detailed insight into this issue. Merci pour votre aperçu détaillé de cette question.
As you can see from my Comme vous pouvez le voir sur mon code above code ci-dessus that I am normally closing my connection to the database. que je suis normalement clôture ma connexion à la base de données. I had opened the database as a single user from my application (in other words not as a server). J'avais ouvert la base de données comme un seul utilisateur de mon application (en d'autres mots non pas comme un serveur). So the rules of server requiring a shutdown shouldn’t really be applicable here. Ainsi, les règles du serveur nécessitant un arrêt ne devrait pas vraiment être applicable en l'espèce.
I am with you wrt. Je suis avec vous wrt. your locking logic in a server scenario. votre logique de verrouillage dans un serveur scénario. However as a single user closing the connection should be sufficient cue to release any lock to the database. Toutefois, comme un seul utilisateur de fermer la connexion devrait être suffisant de repère afin de supprimer toute verrouiller sur la base de données.
I think most use cases to HSQLDB is in single user (non-server) mode. Je pense que la plupart des cas d'utilisation de HSQLDB est en mono-utilisateur (non-serveur) mode. Often we use it to load test cases for junit tests etc. In these cases ability to rapidly restart is a great benefit. Souvent, on l'utiliser pour charger des cas de tests JUnit pour les tests etc Dans ces cas, la capacité à redémarrer rapidement est un grand avantage.
What do you think? Que pensez-vous?
April 6th, 2005 at 1:39 am 6 avril 2005 à 1:39 am
Hello, Bonjour,
i have the same problem. J'ai le même problème.
You’ve wrote: Vous avez écrit:
***********************
you must explicitly issue a command as an admin user. vous devez envoyer une commande comme un utilisateur admin. (”SHUTDOWN …”). ( "FERMETURE…").
***********************
Can you please give me a small code example of that shutdown procedure? S’il vous plaît pouvez-vous me donner un petit exemple de code de cette procédure d'arrêt?
Thank you Merci
Stefan
April 6th, 2005 at 2:09 pm 6 avril 2005 à 2:09 pm
@Stefan @ Stefan
stmt.executeUpdate(”SHUTDOWN”); stmt.executeUpdate ( "shutdown");
where stmt is the java.sql.Statement you have created earlier from HSQLDB java.sql.Connection. où est la stmt java.sql.Statement vous avez créé auparavant par les HSQLDB java.sql.Connection.
January 28th, 2006 at 11:57 pm Janvier 28th, 2006 at 11:57 pm
Nice site and ur information is nice. Nice site et des informations ur is nice.
i appriciate this. i appriciate.
Jakkireddy
April 1st, 2006 at 12:49 am Avril 1st, 2006 at 12:49 am
But what should I do when I debug with my IDE and terminate abruptly my application? Mais que dois-je faire lorsque je debug avec mon IDE et mettre fin brusquement ma demande? This will lead to an not terminated database connection. Cela conduira à une absence de résiliation connexion.
Is there any way to get over this effect? Existe-t-il quelque manière que ce soit pour obtenir plus de cet effet?
April 1st, 2006 at 8:32 am Avril 1st, 2006 at 8:32 am
The file may get corrupted. Le fichier est corrompue mai. At worst you have to manually truncate it. Au pire, vous devez manuellement tronquer.