使用相同的连接对象删除父表和子表

时间:2016-06-22 07:44:47

标签: java sql

我在项目中遇到了旧代码,其中使用相同的连接对象从父表和子表中删除数据。

public void delete()
{
  Connectio con = // Create a connection 
  deleteChildData(con);  // Delete data from child table/ associated table first
  super.delete(con)  //    Delete data from parent table

}

显而易见的是,除非我没有在这个deleteChildData()函数中关闭连接,否则很好。但我不确定这种方法可能是什么其他并发症,如果我使用2个不同的连接对象,是否会有更好的方法来解决这个问题。

3 个答案:

答案 0 :(得分:0)

JDBC Transaction允许您控制事务应该如何以及何时提交到数据库中。

要将其放入交易中,您可以使用

  1. dbConnection.setAutoCommit(false);启动交易冻结。
  2. dbConnection.commit();结束交易冻结。
  3. 您的方法将按以下顺序执行:

    PreparedStatement preparedStatementDelete = null;
    
            con.setAutoCommit(false);
    
            preparedStatementDelete = con.prepareStatement("DELETE_QUERY");
    
            preparedStatementDelete.executeUpdate();
    
            con.commit();
    

答案 1 :(得分:0)

如果已创建并且可用连接,则创建新连接的成本更高。所以最好尝试重用连接。

答案 2 :(得分:0)

获取数据库连接(这是资源,其他示例可以是文件句柄等)成本很高。因此,如果您可以通过使用1或2个连接轻松选择,前者将具有更好的性能。

但是,我们有一个名为连接池的模式,它在某处存储了许多连接(在事务或函数之后不立即释放每个连接),因此您不必关闭在一些SQL查询之后连接,只需在需要时连接到池管理器以获取连接(并让管理器从池中获取连接,或者在池中没有任何内容时为您创建一个新连接)。连接池可以提高性能,同时在启动服务器(获取初始连接数量)时只占用一点内存和一些额外的CPU周期,因此大多数人都会使用它。

然后,如果您使用连接池,则在您的方法中使用1或2个连接之间没有太大区别(除非第2个连接碰巧使池管理器创建新连接)。

大多数基于JVM的服务器提供连接池功能,您可以参考相应的文档以了解用法。但是可以肯定的是,如果您的项目之前没有使用过,那将是非常重构的,所以答案的答案可能就是“1”。