Исключение файла не найдено с файлом конфигурации - PullRequest
0 голосов
/ 28 августа 2018

Я создаю веб-приложение, которое требует подключения Jdbc. Я хочу дать подробности БД из файла конфигурации в текущем рабочем каталоге. Для этого я создал класс ReadConfigFile. Когда я запускаю этот класс индивидуально, он дает мне правильный текущий рабочий каталог. однако, когда я запускаю веб-приложение с сервера, он показывает мне неверный текущий рабочий каталог и выдает исключение FileNotFound. Это мой код:

private static final String pwd=System.getProperty("user.dir");
private static final File configFile=new File(pwd+File.separator+"configFile.txt");

private static BufferedReader br;

public static String getDBHost() {
    String dbHost=null;
    try {
        br=new BufferedReader(new FileReader(configFile));
        String st;
        while((st=br.readLine())!=null) {
            if(st.trim().startsWith("DB Host: ")) {
                dbHost=st.trim().substring(9, st.trim().length());
            }
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        System.out.println(e);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println(e);
    } finally {
        try {
            if(br!=null) {
                br.close();
            }               
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println(e);
        }
    }
    return dbHost;
}

Может кто-нибудь сказать мне, что делать?

1 Ответ

0 голосов
/ 28 августа 2018

Я рекомендую использовать пул соединений, обрабатываемый контейнером, в котором запущено ваше веб-приложение. Вам не нужно заботиться о соединении, контейнер делает это за вас. Если вам нужны только параметры конфигурации, предполагается, что web.xml возьмет их и сделает их доступными в вашем веб-приложении.

Как пример с Tomcat и MySQL. Имя моего источника данных будет jdbc / mydb

1) отредактируйте файл contect.xml в каталоге META-INF и добавьте

      <Resource auth="Container" 
      name="jdbc/mydb" 
      type="javax.sql.DataSource"              
      username="username" password="aC00l6a55w0rd" 
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/DBNAME"/>

2) отредактируйте ваш web.xml в каталоге WEB-INF и добавьте

   <resource-ref>
    <description>application Database</description>
    <res-ref-name>jdbc/mydb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

3) теперь в вашем Java-коде вы можете получить соединение из пула соединений контейнеров. В этом примере я использую JSF и управляемый компонент:

 Connection con = null;
 try {
        Context ctx = new InitialContext();
        //FacesContext fctx = FacesContext.getCurrentInstance();
        DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/mydb");
        con = ds.getConnection();

         // do some database things, like read-write-update or whatever

  } catch ( SQLException sqlex ) {
      System.out.println(getClass().getName() + " SQL Exception: " + sqlex.getMessage();
  } catch (NamingException nmex) {
        System.out.println(getClass().getName() + " Nameing Exception: " + nmex.getMessage();
  } finally (
      try {
        if ( con != null ) {
           con.close();
        }
      catch ( SQLException e) {
         System.out.println(getClass().getName() + " closing Exception: " + e.getMessage();
       }
 }

Важно закрыть все DB-объекты, такие как ResultSet, PreparedStatement и соединение с бесплатными DB-Ressources. На самом деле диспетчер соединений не закрывает соединение. И сможет передать уже открытое соединение следующему потребителю.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...