Vraag Hoe Derby in-memory database correct uit te schakelen


Ik gebruik derby als een ingebedde database. Verder gebruik ik de database-optie in het geheugen voor mijn unit tests.

Wat ik niet kan achterhalen, is hoe ik me goed kan afsluiten (Een snelle blik op de code) de Derby-database. Ik geloof dat ik het voor een standaarddatabase werk, maar ik krijg verschillende uitzonderingen wanneer ik vergelijkbare code probeer in een in-memory database.

Ik ga details weglaten, ik zal ze toevoegen als een ander gevoel nodig is.

In principe probeer ik mijn database te sluiten op deze twee manieren, waar mijn in-memory database consequent "eh" wordt genoemd:

DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");

dan:

DriverManager.getConnection("jdbc:derby:eh;shutdown=true");

Het eerste resulteert in een uitzondering, maar niet de verwachte. De details zijn:

java.sql.SQLNonTransientConnectionException: database 'memory: eh' shutdown.

Het laatste resulteert in

java.sql.SQLException: database 'eh' niet gevonden.

Op basis van wat ik heb kunnen achterhalen, willen we een SQLException maar niet degene die we ontvangen. Aan de andere kant, de SQLNonTransientConnectionException fout lijkt meer geschikt, maar is niet het juiste type (hoewel het is afgeleid van SQLException) noch heeft het de juiste toestandscode. De staatscode wordt uiteindelijk: 08006.

De voorbeeldcode die ik heb illustreert dat een SQLException met een SQL-status van "XJ015".

Opmerking: het voorbeeld waarnaar ik verwijs is: WwdEmbedded-programma (Java-code).


15
2018-02-21 22:54


oorsprong


antwoorden:


XJ015 (met SQLCODE 50000) is de verwachte (succesvolle) SQLSTATE voor volledige systeemuitschakeling. 08006 (met SQLCODE 45000), aan de andere kant, is het verwachte SQLSTATE voor het afsluiten van alleen een individuele database.

DriverManager.getConnection("jdbc:derby:;shutdown=true");

Sluit het volledige systeem af en zou moeten resulteren in XJ015.


20
2018-04-06 23:25



De URL "jdbc: derby: memory: eh; shutdown = true" resulteert in de verwachte 08006-foutcode, maar verwijdert de DB feitelijk niet uit het geheugen. Als u later probeert een nieuwe database te maken met "jdbc: derby: memory: eh; create = true", krijgt u een foutmelding dat de database al bestaat.

Gelukkig is het vanaf Derby 10.6.1.0 (uitgebracht op 17 mei 2010) mogelijk om een ​​in-memory database daadwerkelijk te laten vallen met behulp van een URL met de vorm "jdbc: derby: memory: eh; drop = true". Zie de toelichting en de pagina In-memory databases gebruiken.


12
2017-08-15 22:13



Ik geloof dat je eerste codevoorbeeld in orde is. Het verschil in SQL-status dat u ziet, is volgens mij, omdat u Derby-ingesloten gebruikt, maar de voorbeeldcode die u zag (met SQL-status XJ015) werd uitgevoerd in een client-serverconfiguratie.

Zoals je hebt opgemerkt, is de SQLNonTransientConnectionException een subklasse van SQLException, dus ik ben in de war waarom je denkt dat je niet het juiste type uitzondering krijgt.


0
2018-02-26 05:41