Java - SQLite 数据库已锁定

Java - SQLite database locked

我遇到了 SQLite 和 Java 的问题。

我不知道是因为我要离开一些打开的连接(或 PreparedStatement/ResultSet)还是因为我以错误的方式处理连接,但这段代码让我很难受过去 2 天的时间。

我试图让所有客户都使用 getClientes() 方法注册,那是我收到 "database file locked" 错误的时候。

我已经创建了上面的 class 来创建到 SQLite 数据库的连接:

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] The database file is locked(数据库已锁定)”错误仅在我尝试使用 getClientes() 方法时出现。

有什么想法吗?

我必须先关闭所有连接才能打开另一个连接。

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