我创建了连接对象并存储在hashMap中。在连接对象上执行查询时,我从hashMap中检索对象。在最后一个块中我关闭了连接。 但是,当我们第二次来时,我再次从hashMap中检索连接的对象。这次执行查询时我得到了关闭连接异常。 如果我从最后删除conn.close(),它的工作原理。 这背后的原因是什么?而且,当我打印连接的对象时,我得到了对象。
答案 0 :(得分:1)
如果要为多个查询重复使用相同的Connection
对象,则每次使用它时都不应关闭连接,因为关闭它意味着第二个查询将失败。
因此,您应该为每个查询创建一个新的开放Connection
,或者保持缓存的Connection
开放(即不要在finally
块中关闭它。)
答案 1 :(得分:1)
我认为您必须使用连接池实现而不是简单的连接映射。此处在每次事务后关闭连接时,连接的生命周期结束,您无法从映射中重复使用它。
考虑一个连接池,它可以为您提供已打开的连接,并在您的使用完成后返回/释放连接回池。
答案 2 :(得分:0)
我认为您需要转移到连接池的某些实现。
P.S。查看代码
会很有帮助答案 3 :(得分:0)
在每个sql语句之后,您不必关闭Connection。
新创建的Connection处于自动提交模式:
默认情况下,新连接处于自动提交模式。来自Connection.setAutoCommit
doc:
语句完成时发生提交。的时候了 语句完成取决于SQL语句的类型:•对于DML 语句,如插入,更新或删除,以及DDL语句, 声明在完成执行后立即完成。 •对于 选择语句,语句完成时关联 结果集已关闭。 •对于CallableStatement对象或for 返回多个结果的语句,语句完成 当所有关联的结果集都已关闭时,全部 已检索到更新计数和输出参数。
但是如果将auto-commit设置为false,则必须调用Connection.commit
方法来更新数据库。