应该以静态方式访问DBConnection类型的静态方法getDBConnection()

时间:2015-12-01 09:04:29

标签: java

我有一个单例类,如下所示,用于访问数据库连接

public class DBConnection {
    private static volatile DBConnection instance;
    private static DataSource dataSource;
    private DBConnection(){ 
    }
    public static synchronized DBConnection getInstance() {
        if (instance == null) {
            instance = new DBConnection();
        }
        return instance;
    }
    static {
        try {
            dataSource = (DataSource) new InitialContext()
                    .lookup("java:comp/env/jdbc/MySQLDataSource");
        } catch (NamingException e) {
            e.printStackTrace();
            try {
                throw new Exception("'jndifordbconc' not found in JNDI", e);
            } catch (Exception e1) {
                logger.error("Error description", e);
            }
        }
    }

    public static Connection getDBConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            logger.error("Error description", e);
            return null;
        }

    }
}

当我尝试以这种方式访问​​DBConnection时

SeperateClass

我在这里收到黄色警告

  public String fetchGlobalIndicesData(@QueryParam("region_name") String region_name )
    {
       Connection dbConnection = null;
        String selectsql = "";

        try
        {

            dbConnection = DBConnection.getInstance().getDBConnection();
            selectpstmt = dbConnection.prepareStatement(selectsql);
            selectpstmt.setString(1, region_name);
            selectRset = selectpstmt.executeQuery();
        }
        catch (Exception e)
        {
            logger.error("Error description",e);
        }

    }

Eclipse IDE正在给我一个黄色警告

The static method getDBConnection() from the type DBConnection should be accessed in a static way

你能告诉我这样做的正确方法吗?

我将代码修改为

public static Connection getDBConnection() {
    try {
        return getInstance().dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
        logger.error("Error description", e);
        return null;
    }

}

3 个答案:

答案 0 :(得分:2)

因为它是静态的,所以你应该直接在类上调用方法,而不是在类的实例上调用:

DBConnection.getDBConnection()

虽然有可能,但在实例上调用方法是没有意义的。

答案 1 :(得分:1)

正如@Berger所提到的,你将方法定义为静态,所以你必须像他提到的那样调用它。

如果您不希望它是静态的,您可以通过从getDBConnection方法中删除静态来修改代码并将其命名为:

DBConnection.getInstance().getDBConnection()

上面的代码在fetchGlobalIndicesData方法中已经正确。

只是为了它:

public static Connection getDBConnection()

变为:

public Connection getDBConnection()

这样,getInstance将初始化一个DBConnection实例,并且应该触发用于初始化数据源的静态初始化程序块。然后当你调用getDBConnection时,你的代码应该可以正常工作。

答案 2 :(得分:0)

这是一种静态方法,您可以删除getDBConnection()签名的静态关键字或使用DBConnection.getDBConnection()