2015-02-09 146 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

回答