我使用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);
}
}
}
答案 0 :(得分:1)
是的,它是线程安全的,但速度太慢。
连接创建在任何语言中都是一个非常慢的操作,因此您应该使用任何连接池来节省时间。 另外你应该记住,SimpleDateFormat.format不是线程安全的,所以你应该一次只在一个线程中使用它。
此外,您不应该围绕'execute'方法管理自动提交属性。 Autocommit是连接的属性,您只应将其设置一次。 如果将其设置为 false ,请在每次sql操作后执行'commit'方法(如果需要,不执行) - 您应该手动管理提交。 如果将其设置为 true ,则每次执行sql语句后,连接都会自动生成提交执行
答案 1 :(得分:0)
您应该记住,SQLite可以在3种模式下工作:
1.单螺纹。在此模式下,所有互斥锁都被禁用,并且SQLite一次不能在多个线程中使用。
2.多线程。在这种模式下,多个线程可以安全地使用SQLite,前提是在两个或多个线程中不同时使用单个数据库连接。
3.Serialized。在序列化模式下,SQLite可以被多个线程安全地使用而没有任何限制。