Java: Helfen Sie beim Entwerfen von Deadlocks, die durch SQLite verursacht werdenJava

Java-Forum
Anonymous
 Java: Helfen Sie beim Entwerfen von Deadlocks, die durch SQLite verursacht werden

Post by Anonymous »

BEARBEITEN:
Bei dieser Frage geht es um die Lösung eines Problems nur unter Verwendung von Java-Code. Das Problem wird indirekt durch SQLite verursacht, kann aber nicht durch eine Änderung des Datenbanksystems oder mit SQL-Code gelöst werden. Ich erwähne SQLite, weil Benutzer andernfalls auf nutzlose Lösungen verweisen würden, die tatsächlich gegen die vom Projekt auferlegten Anforderungen verstoßen (eine definierte Benutzeroberfläche und ein definiertes Verhalten und SQLite als DBMS, da es ohne Server ausgeführt werden kann und Projekte einer automatischen Korrektur unterliegen).
EDIT2:
Der Deadlock tritt auf Java-Seite auf, es ist nicht leicht zu erkennen, ich habe einen ganzen Tag lang debuggt, bevor mir klar wurde, dass SQLite vergessen wird, ich muss einen Weg finden, Parking zum Laufen zu bringen Wie ein Monitor, aber ohne Konflikt mit synchronisiertem, der einen Deadlock verursacht

Derzeit habe ich die folgende Situation:
Ich habe eine vereinfachte Parking-Klasse, eigentlich ist es ein Monitor, bei dem Clients die Methode „lendVehicle“ aus anderen Threads aufrufen.

Code: Select all

public class Parking{

private final long       parkId;
private final ParkingAPI sqlLayer;
private final Lock       lock = new ReentrantLock();
private final Condition  notEmpty = lock.newCondition();

public Parking( long mparkId, ParkingAPI api){
sqlLayer = api;
parkId = mparkId;
}

long lendVehicle(){
lock.lock();
try{
while(sqlLayer.countVehicles(parkId) == 0)
notEmpty.await();

return sqlLayer.lend(parkId);

} finally{
lock.unlock();
}
}

void giveBackVehicle(long vehicleId){
lock.lock();
try{
sqlLayer.giveBack(vehicleId,parkId);
notEmpty.signal();

} finally{
lock.unlock();
}
}
Wenn ich die SQL-Schicht nur mit einem atomaren Zähler verspotte, funktioniert die Klasse einwandfrei. Da die Anwendung jedoch SQLite verwendet, muss ich die Verbindung vor gleichzeitigem Zugriff schützen (grundsätzlich kann ich aufgrund von SQLite zu jedem Zeitpunkt eine Abfrage ausführen).
Derzeit wird der Code über das DBLayer-Objekt synchronisiert (das von allen Klassen gemeinsam genutzt wird).

Code: Select all

class ParkingQuery implements ParkingAPI{

private final DBLayer connection;

public SQLLayer(DBLayer db){
connection = db;
}

@Override
int lend(long parkId){
synchronized( connection){
return connection.lendVehicleFromPark(parkId);
}
}

@Override
int countVehicles(long parkId){
synchronized( connection){
return connection.countVehiclesQuery(parkId);
}
}

@Override
void giveBack(long vehicleId, long parkId){
synchronized( connection){
connection.giveBackVehicle(parkId, vehicleId);
}
}
}
Das Problem ist der synchronisierte Teil, der nicht gut mit dem Parkmonitor zusammenspielt: was tatsächlich zu einem Deadlock führt.
Wie kann ich die Funktionalität des Parkens aufrechterhalten? (Synchronisiert kann bei ParkingQuery nicht entfernt werden, da SQLite einfach explodiert, wenn Abfragen nicht synchronisiert sind und schlimme Dinge passieren.)
Beachten Sie, dass der gleichzeitige Zugriff auf SQLite obligatorisch ist, da es sich um ein Schulprojekt handelt.
BEARBEITEN:
Gewünschtes Parkverhalten:
Wenn ein Benutzer ein Fahrzeug ausleihen möchte und dieses nicht verfügbar ist, muss der Benutzer warten, bis jemand anderes ein ausgeliehenes Fahrzeug zurückgibt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post