当前位置: 首页 > 知识库问答 >
问题:

使用java锁和条件对象

岳浩
2023-03-14

我在下面构建了这个数据库对象。

我希望方法更新和查询是:1.以多线程的方式工作(这意味着2个线程可以同时访问它们-同步阻止什么-这就是为什么我不能将其添加为mehtod单线程)。2.如果一个线程开始打开数据库,第二个线程(在它之后开始)正在尝试使用该数据库-我不想得到第二个线程在数据库尚未打开时访问数据库的情况。换句话说-我希望它一般是多线程的,但线程安全(原子)当1个线程第一次打开数据库时。

谢谢,下面的类是我需要插入我的逻辑的地方(更具体 - 查询和更新方法)。

public class SingeltonDB {
    private static DBconnImpl db = null;
    private static SingeltonDB singalDb = null;

    private SingeltonDB(String username, String password) {
        db = new DBconnImpl();
    }

    public static boolean isOpen() {
        return (db != null);
    }

    public synchronized static SingeltonDB getInstance(String username,
            String password) throws Exception {
        if (db != null) {
            throw (new Exception("The database is  open"));
        } else {
            System.out.println("The database is now open");
            singalDb = new SingeltonDB(username, password);
        }
        db.connect(username, password);
        System.out.println("The database was connected");
        return singalDb;
    }

    public synchronized static SingeltonDB getInstance() throws Exception {
        if (db == null) {
            throw (new Exception("The database is not open"));
        }

        return singalDb;
    }

    public void create(String tableName) throws Exception {
        db.create(tableName);
    }

    public  User query(String tableName, int rowID) throws Exception {
        if (db == null) {
            System.out.println("Error: the database is not open");
            return null;
        }
        return (db.query(tableName, rowID));
    }

    public  void update(String tableName, User user) throws Exception {
        if (db == null) {
            System.out.println("Error: the database is not open");
            return;
        }
        db.update(tableName, user);
    }

}

共有1个答案

颛孙英勋
2023-03-14

我会将连接调用从getInance静态方法移动到SingeltonDB构造函数。这将保证每当您获得对静态db字段的引用时都会打开db。我还会将db==null检查添加到所有非静态方法。

public class SingeltonDB {
    private static DBconnImpl db = null;
    private static SingeltonDB singalDb = null;

    private SingeltonDB(String username, String password) {
        db = new DBconnImpl();
        db.connect(username, password);
        System.out.println("The database was connected");
    }

    public static boolean isOpen() {
        return (db != null);
    }

    public synchronized static SingeltonDB getInstance(String username,
            String password) throws Exception {
        if (db != null) {
            throw (new Exception("The database is  open"));
        } else {
            System.out.println("The database is now open");
            singalDb = new SingeltonDB(username, password);
        }
        return singalDb;
    }

    public synchronized static SingeltonDB getInstance() throws Exception {
        if (db == null) {
            throw (new Exception("The database is not open"));
        }

        return singalDb;
    }

    private static void checkDbOpened() throws Exception {
        if (db == null) {
            throw new Exception("The database is not open");
        }
    }

    public void create(String tableName) throws Exception {
        checkDbOpened();
        db.create(tableName);
    }

    public  User query(String tableName, int rowID) throws Exception {
        checkDbOpened();
        return (db.query(tableName, rowID));
    }

    public  void update(String tableName, User user) throws Exception {
        checkDbOpened();
        db.update(tableName, user);
    }

}

这是一个更新的单例,它将允许您确定是否创建了表

public class SingeltonDB {
    private static DBconnImpl db = null;
    private static SingeltonDB singalDb = null;
    private static ConcurrentSkipListSet<String> tableNames = new ConcurrentSkipListSet<String>();

    private SingeltonDB(String username, String password) {
        db = new DBconnImpl();
        db.connect(username, password);
        System.out.println("The database was connected");
    }

    public static boolean isOpen() {
        return (db != null);
    }

    public synchronized static SingeltonDB getInstance(String username,
            String password) throws Exception {
        if (db != null) {
            throw (new Exception("The database is  open"));
        } else {
            System.out.println("The database is now open");
            singalDb = new SingeltonDB(username, password);
        }
        return singalDb;
    }

    public synchronized static SingeltonDB getInstance() throws Exception {
        if (db == null) {
            throw (new Exception("The database is not open"));
        }

        return singalDb;
    }

    private static void checkDbOpened() throws Exception {
        if (db == null) {
            throw new Exception("The database is not open");
        }
    }

    private static void checkForTable(String tableName) {
        if (tableNames.add(tableName)) {
           db.create(tableName);
        }
    }

    public void create(String tableName) throws Exception {
        checkDbOpened();
        checkForTable(tableName);
    }

    public  User query(String tableName, int rowID) throws Exception {
        checkDbOpened();
        checkForTable(tableName);
        return (db.query(tableName, rowID));
    }

    public  void update(String tableName, User user) throws Exception {
        checkDbOpened();
        checkForTable(tableName);
        db.update(tableName, user);
    }

}

checkForTable 函数将确定给定的表名称是否已创建。如果不是,它将创建表。此更新将确保表在使用之前创建。此代码的问题在于,它不能跨进程工作,而只能在单个进程中工作,除非数据库类知道如何管理跨进程边界创建的表。

 类似资料:
  • 问题内容: 我们的一位客户正在使用某些Novell安全软件,有时会锁定我们的软件创建的某些.class文件。发生这种情况时,这会给他们带来一些麻烦的问题,我正在尝试研究一种变通办法,我们可以将其添加到错误处理中以解决此问题。我想知道java api中是否有任何调用可用于检测文件是否已锁定,如果已锁定,则将其解锁。 问题答案: 在尝试写入文件之前,您可以使用File.canWrite()检查Java

  • 假设我有两条线。Thread1正在访问一个同步方法,同时,Thread2正在访问同一对象的另一个同步方法。据我所知,Thread2应该等到Thread1完成它的任务。我的问题是,Thread2是否在对象的等待线程列表中?对我来说似乎是这样,但Thread2不调用wait()方法,那么作为逻辑结果,它不应该在对象的等待线程列表中。如果它不在对象的等待线程列表中,那么Thread2的状态是什么?

  • 我在C中做了一个关于线程、锁和条件变量的练习。我需要编写一个程序来获取数据,将其转换为一个链表,启动3个线程,每个线程为列表中的每个节点计算结果,主线程在evreyone完成后打印结果。 这是主要功能: 请注意,create_numbers功能正常工作,列表按预期工作。 以下是启动线程和线程功能代码: 请注意,self_id用于调试目的。 我的主要问题是分工合作。每个线程从全局链表中获取一个元素,

  • 我试图在C语言中实现用餐哲学家的问题,使用pthon、互斥锁和条件变量。 它需要一个命令行参数来指定程序应该运行多长时间。我必须使用睡眠功能来完成这项任务 我的输出有一些问题: 使主函数在命令行上输入的秒数处于Hibernate状态似乎并没有使输出不同。 大多数哲学家都在渴望程序的大部分执行。 当我打印出一个哲学家在思考或吃饭时,一个“哲学家5”出现了,尽管应该只有0-4个哲学家。 这是我的密码:

  • Hibernate有悲观锁定机制,可以用来锁定数据库行。 session.lock(Object对象,LockMode锁模式)。 假设我锁定了一个对象: > 如果其他线程也发出上述语句 1,会发生什么?该线程会简单地阻塞吗?还是会得到某种异常?像 CannotAcquireLock 异常这样的东西?我想了解 1,2,3 的行为。 如果线程获取了锁然后死亡会发生什么?锁会自动释放吗?还是记录永远锁定

  • 本文向大家介绍Java类锁、对象锁、私有锁冲突测试,包括了Java类锁、对象锁、私有锁冲突测试的使用技巧和注意事项,需要的朋友参考一下 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明。 一、相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. 类锁:在代码中的方法上加了static和synchronized的锁,或者synchronized(xxx.c