Java 中不断出现 Error: [SQLITE_BUSY] The database file is Locked(数据库被锁定)

问题描述 投票:0回答:1

每当我尝试检查用户名是否唯一并随后将其添加到我的数据库中时,我都会收到此错误(错误:org.sqlite.SQLiteException:[SQLITE_BUSY]数据库文件已锁定(数据库已锁定))。我正在使用并且需要使用 Java、JSP 和 JDBC。

这是我的数据库连接和查询的代码:

public class UserDao {
    private static Connection conn = null;
    public static Connection connect() throws Exception {
        if(conn == null) {
            conn = (Connection) DriverManager.getConnection("jdbc:sqlite:c:/Users/ryo/database.db");
        } else {
            conn.close();
            conn = (Connection) DriverManager.getConnection("jdbc:sqlite:c:/Users/ryo/database.db");
        }
        return conn;
    }
    private String table;

    public UserDao(String table) {
        this.table = table;
    }

    public User findUser(String username) throws SQLException {
        PreparedStatement pStmt = conn.prepareStatement("SELECT * FROM " + table + " WHERE Username=?");
        pStmt.setString(1, username);

        try (
        ResultSet rs = pStmt.executeQuery()) {

            if(rs.next()) {
                return new User(
                        rs.getString("Name"), 
                        rs.getString("Username"), 
                        rs.getString("Password"), 
                        rs.getBoolean("Admin")
                );
            }
        } catch (Exception e) {
                System.out.println("ERROR FINDING USER");
                e.printStackTrace();
                return null;
        }
        return null;
    }

    public long addUser(User user, String password) throws SQLException {
        PreparedStatement pStmt = conn.prepareStatement("INSERT INTO " + table + " (Username, Name, Password, Admin) VALUES(?,?,?,?)");
        pStmt.setString(1, user.getUsername());
        pStmt.setString(2, user.getName());
        pStmt.setString(3, password);
        pStmt.setBoolean(4, user.isAdmin());
        int rowsAdded = pStmt.executeUpdate();
        long allocatedId = 0L;
        if (rowsAdded == 1) {
            ResultSet rs = pStmt.getGeneratedKeys();
            if(rs.next()) {
                allocatedId = rs.getLong(1);
            }
        }
        return allocatedId;
    }

}

这是添加和查找用户的代码:

<body>
        <%
            String name = request.getParameter("name");
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            User toAdd = new User(name, username, password, false);
            User existingUser = null;
            boolean userCreated = false;
            try {
                Class.forName("org.sqlite.JDBC");
                UserDao Dao = new UserDao("Users");
                UserDao.connect();
                existingUser = Dao.findUser(username);
                if (existingUser == null) {
                    Dao.addUser(toAdd, password);
                    userCreated = true;
                } 
            }
            catch (SQLException sqlException) {
                out.println("Error: " + sqlException + "\n");
            }
            finally {

            if(userCreated) { 
            out.println("User created succesfully!\nNow try logging in!\n");
        %>
        <a href="./login.html">
            <input type="button" value="Login!" />
        </a>
        <% }
        else {
            out.println("User failed to be created! Already exists.\n Please try again.\n");
            %>
            <a href="./signup.html">
                <input type="button" value="Signup!" />
            </a>
        <%
            }
        }
        %>
    </body>

如果有人能提供一些关于为什么这不起作用的线索,我们将不胜感激。附带说明一下,所有数据库浏览器也都已关闭。

谢谢!

java sqlite jsp
1个回答
0
投票

当 SQLite 无法获取数据库文件的锁定时,通常会发生 [SQLITE_BUSY] 数据库文件被锁定错误(无论是 Java 还是任何其他编程语言),通常是因为另一个连接或进程正在使用它。

  1. 如果您打开 sqlite GUI 并同时更改任何列,您需要通过终端修改数据库,您将收到此错误。因此,尝试关闭您正在使用的 GUI 并尝试运行您的程序。这是因为有多个线程或进程同时访问数据库。

  2. 第一点经常发生,但有时如果之前的数据库连接没有正确关闭,就会出现问题,您必须使用“try,catch”语句来正确打开/关闭数据库。

  3. 如果您的应用程序使用多个线程,请确保它们共享相同的连接,而不是为每个线程创建一个新连接。

© www.soinside.com 2019 - 2024. All rights reserved.