【问题标题】:closing the Database connections in java在java中关闭数据库连接
【发布时间】:2012-07-12 12:42:03
【问题描述】:

我已经编写了以下java代码来连接Oracle Express Edition数据库.....我已经阅读了很多关于关闭连接、语句和结果的信息,但是关于这个问题有一些问题......

1- 我通常会多次测试我的代码,所以如果我不关闭连接等,我会遇到任何问题吗?!!(因为连接是在我的代码中的同一个变量或对象上建立的!!! !)

2-我怎么知道现在有多少个连接?(经过多次测试代码)

3- 我应该将 CLOSE 方法放在 finally 块中并使用新的 TRY CATCH 块还是在 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");
    }
   }
 }

【问题讨论】:

标签: java sql connection try-catch


【解决方案1】:

1) 完成执行后,您将留下许多空闲(挂起)的连接。为了防止这种情况检查连接是否为空。如果是 - 建立一个新的,如果它不为空 - 使用现有的。

2) 可以在sql server 上查看。 ms sql server 示例:How to determine total number of open/active connections in ms sql server 2005

3) 将 close 方法放在 finally 块中是一个好习惯。不要改变那个。有时 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/

【讨论】:

  • 只是添加,OP 应该检查是否 con!= null
  • 还有if(rs != null),因为rs 可能更频繁地无法访问。
  • 代码开头:Connection conn = null;,所以是的,我猜OP应该在关闭它之前检查if (conn != null),与ResultSet和Statement相同,顺序是ResultSet,Statement(Callable , Prepared or simple),最后是 Connection。
  • nkr: try { code } catch { exceptions } finally { release resources },当然你最终会得到另一个 try-catch finally ...
  • msc87:我在答案中添加了两个链接。这些是服务器端方法。
【解决方案2】:

您可能想要使用连接池。看看 C3P0 或 DBCP。您仍然需要关闭结果集和语句,但是当您在连接上调用 close 时,它​​只会将其返回到池中。更新:几年来我们一直在使用Hikari 进行连接池,并且对此非常满意。

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 2020-09-16
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多