2015-02-09 161 views
0

我在解決SQLite和Java的問題。Java - 鎖定SQLite數據庫

我不知道是否因爲我離開了一些開放的連接(或PreparedStatement/ResultSet),或者是因爲我以錯誤的方式處理了連接,但是這段代碼讓我很難過去2天。

我試圖讓所有客戶註冊getClientes()方法,這就是當我得到「數據庫文件鎖定」錯誤。

我創建了上面的類來創建連接到SQLite的DB:

public class ConnectionFactory 
{ 
    public Connection getConnection() 
    { 
     Connection c = null; 

     try 
     { 
      System.out.println("Conectando ao banco de dados..."); 
      Class.forName("org.sqlite.JDBC"); 
      c = DriverManager.getConnection("jdbc:sqlite:src/lp2/database/rivieraresort.db"); 
      System.out.println("Conectado com sucesso!"); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

     return c; 
    } 
} 

而下面的一個處理DB本身

public class RivieraDB 
{ 
    public Quarto buscarQuarto(int contratoID) throws Exception 
    { 
     Quarto quartoEncontrado = null; 

     Connection c = new ConnectionFactory().getConnection(); 
     c = new ConnectionFactory().getConnection(); 
     String query = "SELECT * FROM quartos WHERE contrato_id = ?"; 
     PreparedStatement pstmt = c.prepareStatement(query); 

     pstmt.setInt(1, contratoID); 

     ResultSet rs = pstmt.executeQuery(); 

     while(rs.next()) 
     { 
      String tipo = rs.getString("tipo"); 
      int camasExtras = rs.getInt("camas_extras"); 
      double preco = rs.getDouble("preco"); 

      quartoEncontrado = new Quarto(tipo, camasExtras, preco); 
     } 

     rs.close(); 
     pstmt.close(); 
     c.close(); 
     return quartoEncontrado; 
    } 

    public Contrato buscarContrato(int contratoID) throws Exception 
    { 
     Contrato contratoEncontrado = null; 

     Connection c = new ConnectionFactory().getConnection(); 
     Quarto quartoAssociado = buscarQuarto(contratoID); 
     c = new ConnectionFactory().getConnection(); 
     String query = "SELECT * FROM contratos WHERE id = ?"; 
     PreparedStatement pstmt = c.prepareStatement(query); 

     pstmt.setInt(1, contratoID); 

     ResultSet rs = pstmt.executeQuery(); 

     while(rs.next()) 
     { 
      String inicioContrato = rs.getString("data_inicio"); 
      int tempo = rs.getInt("tempo"); 

      contratoEncontrado = new Contrato(quartoAssociado, inicioContrato, tempo); 
     } 

     rs.close(); 
     pstmt.close(); 
     c.close(); 
     return contratoEncontrado; 
    } 

    public ArrayList<Cliente> getClientes() throws Exception 
    { 
     ArrayList<Cliente> clientesEncontrados = new ArrayList<Cliente>(); 
     Cliente clienteEncontrado = null; 
     Connection c = new ConnectionFactory().getConnection(); 
     String query = "SELECT * FROM clientes"; 
     PreparedStatement pstmt = c.prepareStatement(query); 

     ResultSet rs = pstmt.executeQuery(); 

     while(rs.next()) 
     { 
      String nome = rs.getString("nome"); 
      String cpf = rs.getString("cpf"); 
      String nascimento = rs.getString("nascimento"); 
      String endereco = rs.getString("endereco"); 
      String cartao = rs.getString("cartao"); 
      int contratoID = rs.getInt("contrato_id"); 
      boolean statusHospedagem = rs.getBoolean("status_hospedagem"); 

      clienteEncontrado = new Cliente(nome, cpf, nascimento, endereco); 
      clienteEncontrado.setCartao(cartao); 
      clienteEncontrado.setContrato(buscarContrato(contratoID)); 
      clienteEncontrado.setEstaHospedado(statusHospedagem); 

      clientesEncontrados.add(clienteEncontrado); 
     } 

     rs.close(); 
     pstmt.close(); 
     c.close(); 
     return clientesEncontrados; 
    } 
} 

的「[SQLITE_BUSY]數據庫文件被鎖定(數據庫被鎖定)「錯誤只會在我嘗試使用getClientes()方法時發生。

任何想法?

+0

請總結一下或者我們:1)你想用代碼做什麼2)你看到的是什麼? 3)是什麼觸發的? 4)當你搜索錯誤信息5)其他研究或你試圖讓它工作的東西時發生了什麼。 – 2015-02-09 03:45:12

+0

1)試圖使用getClientes()方法獲取在表中註冊的所有客戶機2)當我嘗試使用getClientes()方法時,我得到「數據庫文件被鎖定」錯誤3)這就是爲什麼我來到這裏4)沒有找到一個類似的案例 – motionCrazy 2015-02-09 04:01:20

+0

你剛告訴我的這些東西應該是你原來的問題的一部分 - 你能編輯你的問題並將它們添加到那裏嗎? (如果有人可能會掃描你的問題認爲你只是不完整,並且沒有閱讀評論) – 2015-02-09 04:02:12

回答