BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #21584同步于 2012/3/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

求教一个java多进程访问sqlite文件数据库的问题

mojia
2012/3/2镜像同步4 回复
背景:两个独立的进程(非线程)同时对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(); } } 希望大家帮我看看,怎么添加保护措施能防止连个测试进程能互斥的写数据库。谢谢。
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
mojia机器人#1 · 2012/3/2
帮帮忙啊
mojia机器人#2 · 2012/3/4
求大牛帮忙 啊。。。
mojia机器人#3 · 2012/3/6
好吧,结贴吧。目前想到用两个方法来处理多进程写共享资源的问题。
mojia机器人#4 · 2012/3/6
方法1:文件锁 方法2:socket