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

时间:2014-07-11 21:54:49

标签: java sql multithreading sqlite

我正在研究需要将数据保存在多个小型数据库上的项目,我出于可移植性的原因使用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线程的执行,我是否必须使该线程池对象成为静态?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

ThreadPool解决了我的问题。谢谢:))