2013-03-23 3 views
3

Я пишу программу, которая использует локальную базу данных SQL для хранения данных.База данных JDBC SQL заблокирована?

Я использую драйвер здесь: https://bitbucket.org/xerial/sqlite-jdbc

Я пытаюсь читать из базы данных и поместить содержимое TABLENAME в JTable так:

public Object[][] getTable(String tableName){ 
    int columns = getColumnNumber(tableName); 
    int rows = getRowNumber(tableName); 
    String[] columnNames = getColumnNames(tableName); 
    Object[][] table = new Object[rows][columns]; 
    try{ 
     Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db"); 
     Statement stmt = connection.createStatement(); 
     ResultSet rs = stmt.executeQuery("select * from " + tableName); 
     for(int r = 0; r < rows; r++){ 
      rs.next(); 
      for (int c = 0; c < columns; c++){ 
       table[r][c] = rs.getString(columnNames[c]); 
      } 
     } 
     return table;   
    }catch(Exception e){ 
     System.out.println("ERROR CREATING TABLE ARRAY"); 
     e.printStackTrace(); 
     return null; 
    } 
} 

Позже я пытаюсь прийти назад и добавьте строку в таблицу:

public boolean addRow(String tableName, Object[] values){ 
    if(!isDataAcceptable(tableName, values)) 
     return false; 
    try{ 
     String stmt = "insert into " + tableName + " values ("; 
     for(int c = 0; c < values.length; c++){ 
      if(values[c] instanceof String) 
       stmt += "'" + values[c] + "'"; 
      else 
       stmt += values[c]; 
      if(c == (values.length - 1)) 
        stmt += ");"; 
      else 
       stmt += ", "; 
     } 
     System.out.println(stmt); 
     Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db"); 
     Statement statement = connection.createStatement(); 
     statement.executeUpdate(stmt); 
     return true; 
    }catch(Exception e){ 
     System.out.println("ERROR INSERTING ROW"); 
     e.printStackTrace(); 
     return false; 
    } 
} 

Я хочу обновить созданный ранее JTable с помощью новой строки.

Когда я пытаюсь добавить строку, однако это вызывает исключение:

java.sql.SQLException: database is locked 

, что указывает на линии:

statement.executeUpdate(stmt); 

... в методе addRow().

Почему заблокирована база данных и как ее разблокировать, чтобы написать ей?

+0

Вы не закрываете ни один из объектов, которые вы создаете, ни «ResultSet», ни «Statement», ни «Connection». Я подозреваю, что это твоя проблема. –

+0

Я чрезвычайно новичок в SQL и предположил, что, поскольку они были локальными ресурсами, они закрывались при завершении метода. Как их закрыть? – user1113827

+0

Как и любой другой внешний ресурс Java, вам нужно называть 'close()' тогда, когда вы закончите. Обычно используется шаблон «try finally». –

ответ

3

Почему база данных заблокирована и как ее разблокировать, чтобы написать ей?

базы данных, скорее всего, заперли в addRow потому что предыдущий вызов getTable не закрывать ResultSet. Код также не позволяет закрыть объекты подключения к базе данных, что приведет к утечке ресурсов.

Основная проблема заключается в том, чтобы позвонить по телефону close() по объектам rs и connection, но вам нужно сделать это, чтобы сделать ваш код надежным.

Вот рекомендуемый способ сделать это в Java 7, используя «примерить ресурсы» синтаксис:

try (Connection connection = 
     DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db"), 
    Statement stmt = connection.createStatement(), 
    ResultSet rs = stmt.executeQuery("select * from " + tableName)) { 
    for (int r = 0; r < rows; r++) { 
    rs.next(); 
    for (int c = 0; c < columns; c++) { 
     table[r][c] = rs.getString(columnNames[c]); 
    } 
    } 
    return table;   
} catch (Exception e) { 
    System.out.println("ERROR CREATING TABLE ARRAY"); 
    e.printStackTrace(); 
    return null; 
} 

Вы также можете сделать это, позвонив close явно в finally блоке, но это более многословным, и код может быть трудно получить правильно, если у вас есть связанные ресурсы, которые необходимо закрыть ... как здесь.

Смежные вопросы