gpt4 book ai didi

Java 如何在Java中为SQLITE创建查询队列以防止数据丢失?

转载 作者:行者123 更新时间:2023-12-01 12:45:57 24 4
gpt4 key购买 nike

我正在开发一个需要将数据保存在多个小型数据库上的项目,出于可移植性的原因我使用 SQLite。数据库由多个线程访问。问题是有时数据会丢失,因为该数据库已在进行一项或多项操作。我使用以下代码来访问多个数据库。

     package db;

/**
*
* @author Nika
*/
import java.sql.*;

public class SQLiteJDBC {

Connection c = null;
Statement stmt = null;
ResultSet rs = null;

public SQLiteJDBC() {
}

public void closeConnection() throws SQLException {
stmt.close();
c.close();

}

public void createtable(String db, String sql) {
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + db);
//System.out.println("Opened database successfully");

stmt = c.createStatement();
stmt.executeUpdate(sql);
// stmt.close();
// c.close();
System.out.println(sql);
System.out.println("Table created successfully");

} catch (ClassNotFoundException | SQLException e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());

}

}

public void insert(String db, String sql) {
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + db);
c.setAutoCommit(false);
// System.out.println("Opened database successfully");

stmt = c.createStatement();
stmt.executeUpdate(sql);

// stmt.close();
c.commit();
// c.close();
System.out.println(sql);
System.out.println("Records created successfully");

} catch (ClassNotFoundException | SQLException e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());

}
}

public ResultSet select(String db, String sql) throws SQLException {

ResultSet rs2=null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + db);
c.setAutoCommit(false);
// System.out.println("Opened database successfully");

stmt = c.createStatement();
rs2 = stmt.executeQuery(sql);
System.out.println(sql);
System.out.println("Operation done successfully");
} catch (ClassNotFoundException | SQLException e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());

}

return rs2;

}

public void Update(String db, String sql) {
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + db);
c.setAutoCommit(false);
// System.out.println("Opened database successfully");

stmt = c.createStatement();
stmt.executeUpdate(sql);
c.commit();

// stmt.close();
// c.close();
System.out.println(sql);
System.out.println("Operation done successfully");
} catch (ClassNotFoundException | SQLException e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());

}

}

public void delete(String db, String sql) {
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + db);
c.setAutoCommit(false);
// System.out.println("Opened database successfully");

stmt = c.createStatement();
stmt.executeUpdate(sql);
c.commit();

// stmt.close();
// c.close();
System.out.println(sql);
System.out.println("Operation done successfully");
} catch (ClassNotFoundException | SQLException e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());

}
}

public void execute(String db, String sql) {
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + db);
c.setAutoCommit(false);
// System.out.println("Opened database successfully");

stmt = c.createStatement();
stmt.executeUpdate(sql);
c.commit();

// stmt.close();
// c.close();
System.out.println(sql);
System.out.println("Operation done successfully");
} catch (ClassNotFoundException | SQLException e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());

}

}

public static void main(String args[]) {
SQLiteJDBC sqLiteJDBC = new SQLiteJDBC();
}
}

每个方法都有两个参数,第一个参数是数据库文件位置,第二个参数是 SQL 查询。我如何为访问同一数据库文件的线程实现任何队列机制,以便防止数据丢失?

编辑:

只要条件成立,就有一个线程 UpdateAfterExecution(args[]) 被另一个线程 Handler() 访问。现在,如果太多客户端向处理程序发送请求并满足多个 UpdateAfterExecution 被调用并运行访问同一数据库的条件,无论如何,是否可以使用 ThreadPool 来限制 UpdateAfterExecution 线程的执行,我是否必须将该线程池对象设为静态?

最佳答案

使用多线程时,sql 访问中的事务需求变得更加必要。您可能希望使用第一个线程启动事务,以使用给定查询访问数据库。一旦所有类似性质的查询都进行了更改,您就可以结束事务。如果您想跟踪更改而不是回滚到上次提交,保存点也可以提供帮助。

关于Java 如何在Java中为SQLITE创建查询队列以防止数据丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24707179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com