2

我使用以下代码连接到 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());
   }
}

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

4

3 回答 3

2

您不必每次都连接。只要确保每次都关闭结果集和语句。将此答案视为一个好的数据库包装类的示例。

您可以使您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() {
         ...
    }
}
于 2012-05-26T13:08:17.897 回答
0

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

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

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

于 2012-05-26T13:55:37.127 回答
0

如果您的应用程序在 Tomcat、GlassFish 等服务器上运行,最好的方法是使用JNDI获取连接。否则,由于您使用的是 Oracle JDBC 驱动程序,因此您可以使用 class OracleDataSource

为了获取Connection对象,您可以实现Singleton 设计模式。一种简单的方法是使用Java 枚举

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());
   }
}
于 2012-05-26T15:16:20.233 回答