2012-05-26 2 views
0

Я использую следующие коды для подключения к базе данных Oracle,:Должен ли я подключаться к базе данных для каждого запроса?

Connection conn = null; 
Statement stmt = null; 
ResultSet rset = null; 
String jdbc_url = "jdbc:oracle:thin:hr/[email protected]:1521:XE"; 
String query = ""; 
try { 
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); 
    conn = DriverManager.getConnection(jdbc_url); 
    stmt = conn.createStatement(); 
    query = "select username " + " from users "; 
    rset = stmt.executeQuery(query); 

    // my codes 

} catch (SQLException sqle) { 
    System.out.println("result error, " + e.getMessage()); 
} catch (NumberFormatException nfe) { 

} finally { 
    try { 
     rset.close(); 
     stmt.close(); 
     conn.close(); 

    } catch (Exception e) { 
     System.out.println("Error in closing " + e.getMessage()); 
    } 
} 

Должен ли я использовать этот код в каждом действии, что я делаю для каждого запроса, который я хочу? Создание соединения и его завершение? Каждый раз?

+0

Является ли это на стороне сервера или на стороне клиента код? – Puce

+0

Я рекомендую вам лучше использовать пул соединений. Драйвер Oracle имеет пул соединений, которые вы можете использовать. С другой стороны, вы можете реализовать общую статическую переменную этого источника данных или использовать шаблон проектирования Singleton. –

ответ

1

Вам не нужно подключаться каждый раз. Просто убедитесь, что вы каждый раз закрываете набор результатов и утверждение. См. this answer в качестве примера для хорошего класса оболочки DB.

Вы можете внести переменную класса Connection, которая инициализируется в конструкторе. Что-то вроде этого:

public class DbWrapper { 
    private Connection conn = null; 
    String jdbc_url="jdbc:oracle:thin:hr/[email protected]:1521:XE"; 

    public DbWrapper() { 
     conn=DriverManager.getConnection(jdbc_url); 
    } 

    public Arraylist<User> getUsers() { 
     ... 
    } 
} 
0

Я рекомендую использовать объединенные соединения/DataSource.

Один экземпляр DataSource является одной единицей работы и должен быть закрыт при завершении работы единицы измерения (но обратите внимание, что он не закрывает соединение db, если вы используете объединенные соединения).

Также рассмотрите использование JPA более высокого уровня.

0

Если ваше приложение работает на сервере, таком как Tomcat, GlassFish, лучшим способом является использование JNDI, чтобы получить соединение. В противном случае, поскольку вы используете драйвер JDBC Oracle, вы можете использовать класс OracleDataSource.

Для получения объекта Connection, вы можете выбрать Singleton design pattern. Простым способом является использование Java enumerations.

enum DBEnum { 
    ORACLE_XE { 
     private DataSource ds = initDataSource(); 
     private DataSource initDataSource() { 
      try { 
       OracleDataSource ds = new OracleDataSource(); 
       ds.setDriverType("thin"); 
       ds.setServerName("localhost"); 
       ds.setPortNumber(1521); 
       ds.setDatabaseName("XE"); // Oracle SID 
       ds.setUser("Herong"); 
       ds.setPassword("TopSecret"); 
       return ds; 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
     @Override 
     public Connection getConnection() throws SQLException { 
      return ds.getConnection(); 
     } 
    }; 
    public abstract Connection getConnection() throws SQLException; 
} 

И с этим вы бы изменить код:

Connection conn = null; 
Statement stmt = null; 
ResultSet rset = null; 
String query = ""; 
try { 
    conn = DBEnum.ORACLE_XE.getConnection(); 
    stmt = conn.createStatement(); 
    query = "select username " + " from users "; 
    rset = stmt.executeQuery(query); 

    // my codes 

} catch (SQLException sqle) { 
    System.out.println("result error, " + e.getMessage()); 
} catch (NumberFormatException nfe) { 

} finally { 
    try { 
     rset.close(); 
     stmt.close(); 
     conn.close(); 

    } catch (Exception e) { 
     System.out.println("Error in closing " + e.getMessage()); 
    } 
} 
Смежные вопросы