我在项目中遇到了旧代码,其中使用相同的连接对象从父表和子表中删除数据。
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 :(得分:0)
JDBC Transaction允许您控制事务应该如何以及何时提交到数据库中。
要将其放入交易中,您可以使用
dbConnection.setAutoCommit(false);
启动交易冻结。dbConnection.commit();
结束交易冻结。您的方法将按以下顺序执行:
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”。