Java线程安全的Sqlite?

时间:2013-10-18 07:58:33

标签: java multithreading sqlite

我使用sqlite来存储聊天记录我现在担心天气我的方法是线程安全的。

下面的方法是我用来将我的消息添加到数据库的方法。

我的方法是线程安全的吗?

public class dbHistory {
    public synchronized void addMessage(String from, String agentName, String msg, String time, String channel) {
        try {
            String databaseFileLocation = "jdbc:sqlite:history_" + agentID + ".db";

            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection(databaseFileLocation);
            PreparedStatement prep = conn.prepareStatement("insert into history values (?, ?, ?, ?, ?);");

            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Calendar cal = Calendar.getInstance();

            prep.setString(1, channel);
            prep.setString(2, from);
            prep.setString(3, msg);
            prep.setString(4, agentName);
            prep.setString(5, dateFormat.format(cal.getTime()));
            prep.addBatch();

            conn.setAutoCommit(false);
            prep.executeBatch();
            conn.setAutoCommit(true);

            conn.close();
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

是的,它是线程安全的,但速度太慢。

连接创建在任何语言中都是一个非常慢的操作,因此您应该使用任何连接池来节省时间。 另外你应该记住,SimpleDateFormat.format不是线程安全的,所以你应该一次只在一个线程中使用它。

此外,您不应该围绕'execute'方法管理自动提交属性。 Autocommit是连接的属性,您只应将其设置一次。 如果将其设置为 false ,请在每次sql操作后执行'commit'方法(如果需要,不执行) - 您应该手动管理提交。 如果将其设置为 true ,则每次执行sql语句后,连接都会自动生成提交执行

答案 1 :(得分:0)

您应该记住,SQLite可以在3种模式下工作:

1.单螺纹。在此模式下,所有互斥锁都被禁用,并且SQLite一次不能在多个线程中使用。

2.多线程。在这种模式下,多个线程可以安全地使用SQLite,前提是在两个或多个线程中不同时使用单个数据库连接。

3.Serialized。在序列化模式下,SQLite可以被多个线程安全地使用而没有任何限制。

http://www.sqlite.org/threadsafe.html