【发布时间】: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