2015-12-01 6 views
0

я получил одноэлементный класс, как показано ниже, для доступа Подключения к базе данных какСтатический метод getDBConnection() от типа DBConnection должен быть доступен статический

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; 
    } 

} 
+0

Вы попробовали '' DBConnection.getDBConnection() '' –

ответ

1

Как уже упоминалось @Berger, вы определили метод как статические, так что вы должны назвать его как он отметил ,

Если вы не хотите его статическим, вы можете изменить свой код, удаляя статический из метода getDBConnection и называют его:

DBConnection.getInstance().getDBConnection() 

Код выше уже правильно в вашем fetchGlobalIndicesData методе.

Только ради этого:

public static Connection getDBConnection() 

становится:

public Connection getDBConnection() 

Таким образом, деЫпзЬапс будет инициализировать экземпляр DBConnection, и статический блок инициализации для инициализации вашего источник данные должны стрелять. Затем, когда вы вызываете getDBConnection, ваш код должен работать нормально.

+0

Я изменил свой код в соответствии с вашими комментариями, см. Мой отредактированный вопрос. – Pawan

+0

@Preethi Jain Я думаю, что ваши изменения неправильные. Содержимое вашего getDBConnection было в порядке. Удаление статического ключевого слова с помощью метода getDBConnection - это все, что вам нужно сделать. См. Мой отредактированный ответ. –

2

Так как статические, вы должны вызвать метод непосредственно на классе, а не в экземпляре класса:

DBConnection.getDBConnection() 

Назвав метод на экземпляре не имеет смысла, хотя это возможно.

+0

Хорошо, тогда, когда вызывается метод getInstance() ?? поскольку экземпляр имеет значение null. – Pawan

+1

Удалите статическое ключевое слово из вашего метода, оно даст вам ожидаемый результат. См. Мой ответ. –

0

То есть статический метод, вы можете удалить статический ключевое слово в getDBConnection() подписи или использовать DBConnection.getDBConnection()

Смежные вопросы