Java - SQLite数据库被锁定

时间:2015-02-09 03:38:53

标签: java sql database sqlite jdbc

我在使用SQLite和Java时遇到了问题。

我不知道是不是因为我要离开一些打开的连接(或PreparedStatement / ResultSet),或者是因为我正在以错误的方式处理Connection,但这段代码让我很难过去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;
    }
}

以下一个处理数据库本身

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()方法时才会出现错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我必须在打开另一个连接之前关闭所有连接。

这个(SQLITE Database is locked in java (IDE NetBeans))问题的答案让我解决了我的问题。