我使用以下代码连接到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());
}
}
我是否必须在为每个我想要的查询执行的每个操作中使用此代码?建立连接并终止它?每次?
答案 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());
}
}