在哪个地方写connection.close()和preparedstatement.close()

时间:2014-10-14 08:29:55

标签: java jdbc database-connection prepared-statement

我是JDBC新手......

Student类具有Constructor,add(),update()和delete()等方法......

在构造函数中打开一个连接。在下面的代码帮助我

中写conn.close()和pstmt.close()的位置
class Student
{
    Connection conn;

    PreparedStatement  pstmt;

    ResultSet rs;

    public Student()
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");

            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
        }
        catch(Exception e)
        {
             System.out.println("Error :"+e.getMessage());
        }

    }


    public void add(int rollno,String name)
    {
        try
        {
            pstmt = conn.prepareStatement("insert into student values (?, ?)");

            pstmt.setInt(1,rollno);

            pstmt.setString(2, name);

            int i = pstmt.executeUpdate();

            if (i != 0) {
                System.out.println("Record Inserted");
            } else {
                System.out.println("Record Not Inserted");
            }

        }
        catch(Exception e)
        {
             System.out.println("Error :"+e.getMessage());
        }

    }

    public void update(int rollno,String name)
    {
        try
        {
            pstmt = conn.prepareStatement("update student set name=? where rollno=?");

            pstmt.setString(1, name);

            pstmt.setInt(2,rollno);


            int i = pstmt.executeUpdate();

            if (i != 0) {
                System.out.println("Record Updated");
            } else {
                System.out.println("Record Not Updated");
            }


        }
        catch(Exception e)
        {
             System.out.println("Error :"+e.getMessage());
        }
    }

    public void delete(int rollno)
    {
        try
        {
            pstmt = conn.prepareStatement("delete from student where rollno=?");

            pstmt.setInt(1,rollno);


            int i = pstmt.executeUpdate();

            if (i != 0) {
                System.out.println("Record Deleted");
            } else {
                System.out.println("Record Not Deleted");
            }

        }
        catch(Exception e)
        {
             System.out.println("Error :"+e.getMessage());
        }
    }

}

5 个答案:

答案 0 :(得分:1)

根据您发布的示例代码,您尝试执行的所有操作(例如Add UpdateDelete都会使用全局创建的相同连接对象并初始化在你的构造函数" Student()"。 This is not a standard practice

根据标准,您不应该这样做,您应该在每个操作上创建新的连接作为local变量,例如'添加'更新'并且'删除' seperately

另外请记住,如果您使用的是Bean管理的交易'然后你需要在关闭之前提交事务。否则在finally块

中添加conn.commit();

以下是您的方法应如何

的简单示例
public void add(int rollno,String name)
{
    Connection conn = null;
    PreparedStatement pstmt = null;
    try
    {
        pstmt = conn.prepareStatement("insert into student values (?, ?)");

        pstmt.setInt(1,rollno);

        pstmt.setString(2, name);

        int i = pstmt.executeUpdate();

        if (i != 0) {
            System.out.println("Record Inserted");
        } else {
            System.out.println("Record Not Inserted");
        }

    } catch(Exception e) {
         System.out.println("Error :"+e.getMessage());
    } finally {
         if(pstmt!=null) {
             pstmt.close();
         }
         if(conn!=null) {
             conn.comit(); // Add this line ONLY if you use bean managed transaction
             conn.close();
         }
    }

}

答案 1 :(得分:0)

我想你应该添加另一个方法来关闭连接,并在完成操作时在你的对象上调用它。

public void closeConnection() {
    conn.close();
}

同样最好创建另一种方法来打开连接,而不是从构造函数中打开它。

答案 2 :(得分:0)

首先,我不打开构造函数中的连接,因为它可能导致很多连接在没有被使用的情况下长时间打开,并且因为连接是有限的资源,所以你应该保持它们的开放性。尽可能少的时间。

我会在每个使用它的方法中打开和关闭连接(和准备好的语句)(addupdatedelete等等。这样,只有在需要时才会打开连接。

答案 3 :(得分:0)

您可以使用try-catch-finally块并关闭finally中的连接。

Connection con;
try
{
  con = new Connection(...);
}
catch (Exception e)
{
 //Error Handling
}
finally
{
  connection.close();
}

或者您使用try-with-resource并让VM负责关闭连接(在这种情况下,您不需要将Connection声明为字段,但每个操作都有一个):

try(Connection con = new Connection(...))
{

}
catch()
{

}

答案 4 :(得分:0)

finally块之后添加catch块以关闭PreparedStatementConnection对象。像

这样的东西
catch (Exception d) {
   //do whatever you want when exception occurs
}
finally {
    //close resultset
    //close prepared statement
    //close connection object
}

finally确保在控件返回之前关闭资源。即使您在return块中使用try,也会关闭资源。