Problem mit Derby bei executeUpdate

Status
Nicht offen für weitere Antworten.

liesmich.txt

Mitglied
Hallo Gemeinde,

ich stehe vor einem mir unerklärlichem Rätsel:

Java:
  public static Connection sqlcon() throws Exception {
  // Verbindungsparameter f�r die DB erstellen
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
    Properties properties = new Properties();
    properties.put("user", "quiz");
    properties.put("password", "quiz");
    Connection connection = DriverManager.getConnection("jdbc:derby:quizDB;create=true", properties);
  // Verbindung ende
         
    //connection.close();      
    return connection;
  }

private void BtnOptionsDatabaseEditorDelActionPerformed(java.awt.event.ActionEvent evt) {                                                            
            try {
                Statement statement = sqlcon().createStatement();                
                int rIndex  = TableOptionsDatabaseEditorQry.getSelectedRow();
                int rFID    = (Integer)TableOptionsDatabaseEditorQry.getValueAt(rIndex, 0);                        
                if( (rFID != 0) || (rFID == -1) ) {
                    statement.executeUpdate("DELETE FROM FRAGE WHERE FID = "+rFID);                
                }
                statement.close();
//            ResetOptionsDatabase();
//            RefreshTableFragen();
        } catch (SQLException ex) {
            Logger.getLogger(TestQgui.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(TestQgui.class.getName()).log(Level.SEVERE, null, ex);
        }
}

Also, ich habe auf einen Button (BtnOptionsDatabaseEditorDel) eine SQL Löschanweisung gelegt.
Diese Anweisung funktioniert einwandfrei, wenn ich sie in der Mainfunktion ausführe. Wenn ich jedoch den dafür vorgesehenen Button klicke, bekomme ich einen Derby Timeout:

Code:
java.sql.SQLTransactionRollbackException: A lock could not be obtained within the time requested

Ich finde den Grund dafür einfach nicht. Soweit ich das verstehe, bedeutet der Fehler, dass er die DB nicht sperren kann, weil sie wohl schon belegt ist, oder so.
Aber sie ist nicht mehrfach in Benutzung und die selbe Löschfunktion funktioniert in der Mainfunktion, ohne GUI dazwischen...
Bin echt am verzweifeln und hoffe, dass ihr mir helfen könnt ...

MFG
 
Der Datensatz ist halt noch gelockt. Scheinbar vergisst du irgnedwo anders im Code ein Commit bzw schließen des Statements.

BTW: sollte es nicht "if (rfid != 0 && rfid != -1)" heißen?
 
Danke für die Antwort!
Es würde aus meiner Sicht keinen Sinn ergeben, dass das Statement noch irgendwo geöffnet ist.
Habe eben mal folgende Konstelation getestet:

Java:
private void BtnOptionsDatabaseEditorDelActionPerformed(java.awt.event.ActionEvent evt) {
[.....]
         Statement statement = sqlcon().createStatement();                
                int rIndex  = TableOptionsDatabaseEditorQry.getSelectedRow();
                int rFID    = (Integer)TableOptionsDatabaseEditorQry.getValueAt(rIndex, 0);                        
                if( (rFID != 0) || (rFID == -1) ) {
                    statement.executeUpdate("DELETE FROM FRAGE WHERE FID = "+rFID);                
                }
                statement.close();

geändert in

Java:
private void BtnOptionsDatabaseEditorDelActionPerformed(java.awt.event.ActionEvent evt) {
[....]
int rFID = 12;
Statement statement = sqlcon().createStatement();                
statement.executeUpdate("DELETE FROM FRAGE WHERE FID = "+rFID);

Das untere funktioniert ohne Probleme, auch beim Btnklick.
Wenn ich aber rFID = (Integer)TableOptionsDatabaseEditorQry.getValueAt(rIndex, 0) setze, kommt der Lock-Fehler. Aber auch NUR dann. Das ist echt komisch, dort einfach eine zweistellige int Zahl steht.
Das wird hier immer freakiger ???:L
 
Ein jTable mit zwei Spalten "FID" und "Frage".
Die Zeilen sind aus einer SQL Abfrage gefüllt...
Und es geht mir halt darum, die FID aus der markierten Stelle der Tabelle auszulesen. Sprich Spalte 0 der markierten Zeile.
Ein klick auf den Btn soll den eintrag aus der DB löschen.
Ich bekomme also ein String zurück, den ich in int wandle.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben