我正在研究需要将数据保存在多个小型数据库上的项目,我出于可移植性的原因使用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();
}
}
其中每个方法有两个参数,第一个是db文件位置,第二个是sql查询。如何为访问相同db文件的线程实现任何队列机制,以防止数据丢失?
编辑:
只要条件成立,就会有另一个线程UpdateAfterExecution(args[])
访问一个线程Handler()
。现在,如果有太多客户端向处理程序发送请求并满足条件,则调用多个UpdateAfterExecution
并运行哪个访问同一个DB,
无论如何使用UpdateAfterExecution
来限制ThreadPool
线程的执行,我是否必须使该线程池对象成为静态?
答案 0 :(得分:1)
使用多个线程时,甚至更需要sql访问中的事务。您可能希望使用第一个线程启动事务以使用给定查询访问数据库。一旦所有类似性质的查询都进行了更改,您就可以结束交易。如果要跟踪更改而不回滚到上次提交,保存点也会有所帮助。
答案 1 :(得分:0)
ThreadPool
解决了我的问题。谢谢:))