我在使用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()方法时才会出现错误。
有什么想法吗?
答案 0 :(得分:0)
我必须在打开另一个连接之前关闭所有连接。
这个(SQLITE Database is locked in java (IDE NetBeans))问题的答案让我解决了我的问题。