我是否必须为每个查询连接到数据库?

时间:2012-05-26 13:06:43

标签: java database oracle

我使用以下代码连接到Oracle的数据库:

Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
String jdbc_url = "jdbc:oracle:thin:hr/hr@localhost: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());
   }
}

我是否必须在为每个我想要的查询执行的每个操作中使用此代码?建立连接并终止它?每次?

3 个答案:

答案 0 :(得分:1)

您不必每次都连接。只需确保每次都关闭结果集和语句。有关良好的数据库包装类的信息,请参阅this answer

您可以使Connection类变量在构造函数中初始化。像这样:

public class DbWrapper {
    private Connection conn = null;
    String jdbc_url="jdbc:oracle:thin:hr/hr@localhost:1521:XE";

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

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

答案 1 :(得分:0)

我建议使用池连接/数据源。

一个DataSource实例是一个工作单元,应在工作单元完成时关闭(但请注意,如果您使用池连接,它将不会关闭数据库连接。)

还要考虑使用更高级别的JPA。

答案 2 :(得分: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());
   }
}