首页 > 解决方案 > Java Singleton 不可访问,尽管它是公共静态的

问题描述

我目前正在编写一个三层架构银行应用程序作为学生项目。由于我理解了 Dao 模式,我实现了它并想处理与它的数据库交互,但我实际上做不到,因为我的 dao 类无法访问数据库单例 getInstanceDB。dao 类是一个接口的实现。这些类都在同一个包中。这似乎是一个可见性问题,因为 Singleton 在除自身之外的任何其他类中都不可调用。这是代码。

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;

    public class Database {
        private static Database instance;
        private Connection conn;
        private Statement stmt;

        private Database() {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection("jdbc:oracle:thin:@oracle.leuphana.de:1521:oradb1", "...", "...");
                stmt = conn.createStatement();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        // Thread-Safe Singleton
        public static synchronized Database getInstanceDB() {
            if (instance == null) {
                instance = new Database();
            }
            return instance;
        }
    }
// Select Data by CustomerID
    @Override
    public ResultSet select(Kunde kunde) {
        if (kunde == null)
            throw new IllegalArgumentException("given id is null");

        if (kunde.getId() < 0)
            throw new IllegalArgumentException("given id has an invalid value");

        String query = "SELECT * FROM customer WHERE customer_id=" + Integer.toString(kunde.getId());
        ResultSet rs  = null;
        try {
            Connection conn = getInstanceDB().getConnection();
            Statement stmt = conn.createStatement();
            rs =  stmt.executeQuery(query);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return rs;
    }

我是stackoverflow的新手,希望这个帖子没问题,如果您需要更多信息,请问我^^

编辑:错误:方法 getInstanceDao() 未定义 KundeDao getConnection() 类型查看答案,除了捕获部分外,它是相同的

感谢您提供快速而有用的答案。

标签: javasingletondaoojdbc

解决方案


我觉得你的逻辑有点不对。尝试这样的事情。

public Connection getConnection() {
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection("jdbc:oracle:thin:@oracle.leuphana.de:1521:oradb1", "...", "...");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}

然后创建您的数据库实例并像这样调用 getConnection() 方法。

Database dbInstance = Database.getInstanceDB();

public void anyMethod(){
    try {
        Connection conn = dbInstance.getConnection();
        Statement stmt = conn.createStatement();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

注意:要打开关闭连接,您应该使用try-with-resources更方便的方法。


推荐阅读