每当我尝试检查用户名是否唯一并随后将其添加到我的数据库中时,我都会收到此错误(错误: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>
如果有人能提供一些关于为什么这不起作用的线索,我们将不胜感激。附带说明一下,所有数据库浏览器也都已关闭。
谢谢!
当 SQLite 无法获取数据库文件的锁定时,通常会发生 [SQLITE_BUSY] 数据库文件被锁定错误(无论是 Java 还是任何其他编程语言),通常是因为另一个连接或进程正在使用它。
如果您打开 sqlite GUI 并同时更改任何列,您需要通过终端修改数据库,您将收到此错误。因此,尝试关闭您正在使用的 GUI 并尝试运行您的程序。这是因为有多个线程或进程同时访问数据库。
第一点经常发生,但有时如果之前的数据库连接没有正确关闭,就会出现问题,您必须使用“try,catch”语句来正确打开/关闭数据库。
如果您的应用程序使用多个线程,请确保它们共享相同的连接,而不是为每个线程创建一个新连接。