返回信息流背景:两个独立的进程(非线程)同时对sqlite文件数据库进行读写操作。sqlite本身支持多进程读操作,但是并不支持多进程写操作。所以我需要处理好多进程写sqlite的问题。
我写了一个小程序来模拟完成这个任务。但是程序里面没有添加保护措施。我查了好多的方法,目前自己在用FileLock来互斥进程写sqilte文件。
一个Putter线程写数据库:
public class Putter implements Runnable {
private DB db = null;
private String name = null;
public Putter(String name) {
this.name = name;
this.db = new DB();
}
@Override
public void run() {
for (int i = 0; i < 5000; i++) {
boolean result = db.putOne(new Entity("wangxin" + i));
if (!result) {
System.out.println(name + "放进失败");
} else {
System.out.println(name + "放进成功");
}
}
}
}
一个封装了数据库操作的类db.java
public class DB {
private static Connection connection = null;
private static PreparedStatement preparedStatement = null;
private ResultSet resultset = null;
public static boolean init() {
...
}
private boolean isExist(String name) {
....
}
public synchronized boolean putOne(Entity one) {
if (isExist(one.getName())) {
System.out.println("已经存在");
return false;
} else {
String sql = "INSERT INTO '" + Constants.HIEP_TB + "' VALUES (?,?)";
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, one.getName());
preparedStatement.setString(2, one.getAge());
preparedStatement.executeUpdate();
return true;
} catch (SQLException e) {
e.printStackTrace();
}
}
return false;
}
public ArrayList<Entity> getAll() {
....
}
}
一个实体类,就是要存到数据库里面的内容:
public class Entity {
private String name;
private String age;
getter()
setter()
}
两个测试进程:
public class TestMain1 {
public static void main(String[] args) throws Exception {
DB.init();
new Thread(new Putter("putter10")).start();
new Thread(new Putter("putter11")).start();
new Thread(new Putter("putter12")).start();
new Thread(new Putter("putter13")).start();
//new Thread(new Reader()).start();
}
}
public class TestMain2 {
public static void main(String[] args) throws Exception {
DB.init();
new Thread(new Putter("putter20")).start();
new Thread(new Putter("putter21")).start();
new Thread(new Putter("putter22")).start();
new Thread(new Putter("putter23")).start();
//new Thread(new Reader()).start();
}
}
希望大家帮我看看,怎么添加保护措施能防止连个测试进程能互斥的写数据库。谢谢。
这是一条镜像帖。来源:北邮人论坛 / java / #21584同步于 2012/3/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求教一个java多进程访问sqlite文件数据库的问题
mojia
2012/3/2镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。