2012-05-26 86 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爲例說明一個好的數據包封裝類。

您可以使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實例是一個工作單元,應在工作單元完成時關閉(但請注意,如果您使用池連接,它不會關閉數據庫連接)。

還考慮使用更高級別的JPA。

0

如果您的應用程序運行在Tomcat,GlassFish等服務器上,最好的方法是使用JNDI來獲得連接。否則,由於您正在使用Oracle JDBC驅動程序,因此可以使用類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()); 
    } 
} 
相關問題