【问题标题】:Java - SQLite database lockedJava - SQLite 数据库被锁定
【发布时间】:2015-02-09 03:38:52
【问题描述】:

我遇到了 SQLite 和 Java 的问题。

我不知道是因为我留下了一些打开的连接(或 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;
    }
}

以及下面的一个来处理数据库本身

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) 你想用代码做什么 2) 你看到的是什么? 3)是什么触发了它? 4) 当你用谷歌搜索错误消息时发生了什么 5) 任何其他研究或你试图让它工作的事情。
  • 1) 尝试使用 getClientes() 方法在表中注册所有客户端 2) 当我尝试使用 getClientes() 方法时出现“数据库文件已锁定”错误 3) 这就是原因我来了 4) 没有找到类似的案例
  • 您刚刚告诉我的这些内容应该是您最初问题的一部分 - 您可以编辑您的问题并将它们添加到那里吗? (以防可能扫描您的问题的人认为您只是不完整并且不阅读 cmets)
  • 另外 - 请去掉任何与问题不直接相关的代码(这样我们就不必扫描大量不相关的代码)。这是一篇关于如何让他最好的人帮助你解决堆栈溢出的好文章:stackoverflow.com/help/how-to-ask
  • 好的,谢谢你的提示。

标签: java sql database sqlite jdbc


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-10-07
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2015-05-11
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多