我编写了以下java代码来连接Oracle Express Edition数据库.....我已经阅读了很多关于关闭连接,声明和结果的内容,但是有一些关于这个问题的问题......
1-我通常会多次测试我的代码,所以如果我不关闭连接等等,我会遇到任何问题吗?!!(因为连接是在我的代码中的同一个变量或对象上进行的! !)
2 - 我如何理解现在存在多少个连接?(在多次测试代码之后)
3-我应该使用新的TRY CATCH块在finally块中放置CLOSE方法,还是在main方法之后添加THROWS SQLException?这些与实施有什么区别?!!!
package mainAssignment;
import java.sql.*;
import java.text.MessageFormat;
import java.math.*;
import java.util.*;
//import java.text.MessageFormat;
public class Conn {
/**
* @param args
*/
public static void main(String[] args)throws SQLException{
// TODO Auto-generated method stub
String jdbcURL = "jdbc:oracle:thin:@localhost:1521:xe";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String user = "hr";
String passwd = "hr";
Scanner input = new Scanner(System.in);
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(jdbcURL, user, passwd);
System.out.println("ok");
System.out.println("Please enter the desired employee ID: ");
Object[] arg={new String(input.nextLine())};
String query = MessageFormat.format(
"select * from EMPLOYEES where employee_id={0}", arg);
//System.out.println(query);
stmt = conn.createStatement();
stmt.executeQuery(query);
rs = stmt.getResultSet();
while (rs.next()) {
BigDecimal empid = rs.getBigDecimal(1);
String firstname = rs.getString("FIRST_NAME");
System.out.println("employee ID " + empid
+ " first name is " + firstname);
}
} catch (SQLException e) {
e.printStackTrace();
// TODO
} catch (ClassNotFoundException e) {
// TODO
e.printStackTrace();
} finally {
conn.close();
rs.close();
if (conn.isClosed())
System.out.println("no connection any more");
else
System.out.println("connection exists");
}
}
}
答案 0 :(得分:2)
1)完成执行后,您将留下许多空闲(挂起)连接。要防止检查连接是否为null。如果是 - 建立一个新的,如果它不是null - 使用现有的。
2)你可以在sql server上查看它。 ms sql server的示例:How to determine total number of open/active connections in ms sql server 2005
3)在finally块中使用close方法是一种很好的做法。不要改变它。有时finally块也需要自己的内部try-catch-finally块。
旁注:如果您创建抛出异常的方法,则无法解决任何问题。它只是迫使需要维护使用你的方法的人的例外。有时它是一种很好的方法,但更常见的不是。
在实际应用程序中,您还应检查数据库是否可用,连接是否已建立且查询结果是否为空。
附录1:如何检查oracle express中的活动连接数:
How to list active / open connections in Oracle?
http://dbalink.wordpress.com/2008/06/08/find-active-sessions-in-oracle-database/
答案 1 :(得分:1)
您可能想要使用连接池。看看C3P0或DBCP。您仍然需要关闭结果集和语句,但是当您在连接上调用close时,它只会将其返回到池中。更新:我们几年来一直在使用Hikari进行连接池,并对它非常满意。