数据库锁定了SQLite Java

时间:2016-02-23 10:45:17

标签: java

我正在制作一些程序,用于检查不同用户名的方法比例。当我调用函数DodajObrisiPristupe(table,comboBox)时,它说数据库已锁定。我搜索了解决方案,所有人都说我可能没有在某处关闭连接,但我无法找到它。有人可以帮帮我吗?

public void DodajObrisiPristupe(JTable tabela, JComboBox<String> korisnickoime)
{
    DefaultTableModel model = (DefaultTableModel)tabela.getModel();

    for (int i = 0; i < model.getRowCount(); i++)
    {
        String serijskibroj = model.getValueAt(i, 2).toString();
        boolean pristup = (Boolean)model.getValueAt(i, 4);

        if(ProveriDaLiPostojiPristup(serijskibroj, korisnickoime.getSelectedItem().toString()) == true)
        {
            if(pristup == false)
                ObrisiPristup(serijskibroj, korisnickoime.getSelectedItem().toString());
        }

        else
        {
            if(pristup == true)
                DodajPristup(serijskibroj, korisnickoime.getSelectedItem().toString());
        }
    }
}
public boolean ProveriDaLiPostojiPristup(String serijskibroj, String korisnickoime)
{
    Connection c = null;
    Statement stmt = null;

    try {

        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db");

        stmt = c.createStatement();

        ResultSet rs = stmt.executeQuery("SELECT * FROM PRISTUPI;");

        while(rs.next())
        {
            if(Decrypt(rs.getString("korisnickoime")).equals(korisnickoime) && Decrypt(rs.getString("vage")).equals(serijskibroj))
                return true;
        }

        rs.close();
        stmt.close();
        c.close();
    } 
    catch ( Exception e ) {

        System.err.println( e.getClass().getName() + ": " + e.getMessage() );
        System.exit(0);
    }

    return false;
}
public void DodajPristup(String serijskibroj, String korisnickoime)
{
    Connection c = null;
    Statement stmt = null;

    try {

        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db");

        stmt = c.createStatement();

        String sql = "INSERT INTO PRISTUPI (KORISNICKOIME,VAGE) " +
                  "VALUES ('" + Encrypt(korisnickoime) + "', '" + Encrypt(serijskibroj) + "');"; 
        stmt.executeUpdate(sql);

        stmt.close();
        c.close();
    } 
    catch ( Exception e ) {

        System.err.println( e.getClass().getName() + ": " + e.getMessage() );
        System.exit(0);
    }
}
public void ObrisiPristup(String serijskibroj, String korisnickoime)
{
    Connection c = null;
    Statement stmt = null;

    try {

        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db");

        stmt = c.createStatement();

        String sql = "DELETE from PRISTUPI where KORISNICKOIME = '" + Encrypt(korisnickoime) + "' AND VAGE = '" + Encrypt(serijskibroj) + "';";
        stmt.executeUpdate(sql);

        stmt.close();
        c.close();
    } 
    catch ( Exception e ) {

        System.err.println( e.getClass().getName() + ": " + e.getMessage() );
        System.exit(0);
    }
}

1 个答案:

答案 0 :(得分:0)

您未在ProveriDaLiPostojiPristup(String, String)中关闭连接。

你应该总是将你的连接包装在try-with-resources中,或者尝试最终,所以它们总是关闭的。

   c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db");

    stmt = c.createStatement();

    ResultSet rs = stmt.executeQuery("SELECT * FROM PRISTUPI;");

    while(rs.next())
    {
        if(Decrypt(rs.getString("korisnickoime")).equals(korisnickoime) &&
            Decrypt(rs.getString("vage")).equals(serijskibroj))
            return true;
    }

    rs.close();
    stmt.close();
    c.close();

会发生什么,是你的方法返回true,但由于执行在那里停止,它不会执行它下面的行。如果将语句包装在try with resources块中,则可以解决此问题:

try(c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db")){

   try(stmt = c.createStatement()){

     try(ResultSet rs = stmt.executeQuery("SELECT * FROM PRISTUPI;")){

        while(rs.next())
        {
            if(Decrypt(rs.getString("korisnickoime")).equals(korisnickoime) && Decrypt(rs.getString("vage")).equals(serijskibroj))
                return true;
        }

     }
   }
}