2016-06-22 27 views
0

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

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个不同的连接对象,是否会更好地解决这个问题。

回答

0

通过JDBC事务,您可以控制事务应该如何以及何时提交到数据库中。

为了把这个事务中,你可以使用

  1. dbConnection.setAutoCommit(false);开始一个事务块。
  2. dbConnection.commit();结束一个事务块。

你的方法将在下面的顺序执行:

PreparedStatement preparedStatementDelete = null; 

     con.setAutoCommit(false); 

     preparedStatementDelete = con.prepareStatement("DELETE_QUERY"); 

     preparedStatementDelete.executeUpdate(); 

     con.commit(); 
0

创建新的连接是昂贵时,已经可以创建连接和。所以最好尝试重新使用连接。

0

获取数据库连接(这是一个资源,其他示例可以是文件句柄等)是昂贵的。所以如果你可以无痛地选择使用1或2个连接,前者的性能会更好。但是,我们有一个名为的连接池,它在某处存储了许多连接(不是在事务或函数之后立即释放每个连接),因此您不必在一些SQL之后关闭连接查询,并在需要时连接池管理器以进行连接(并让管理器从池中获取连接或在池中没有任何剩余池时创建新连接)。连接池可以提高性能,但启动服务器时只占用一点存储空间和一些额外的CPU周期(获得最初的连接数量),因此大多数人都使用它。

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

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

相关问题