java何时可以安全地关闭PreparedStatement使用的InputStream。挫折?
PreparedStatement.setBlob
、PreparedStatement.setBinaryStream
和其他一些PreparedStatement
方法可以从InputStream
中读取查询数据。不幸的是,读取数据时,上的文档根本不清楚。它只说
data will be read from the stream as needed until end-of-file is reached.
当需要数据时,我可以想到三种可能的解释:
- 在调用setBlob(或具有
InputStream
参数的其他方法)返回之前 - 执行语句时
- 当事务提交时
那么,在什么时候关闭InputStream
(或所讨论的InputStream
所依赖的其他资源)是安全的呢?它是否取决于驱动程序(我目前正在使用MySQL
,但由于我喜欢保留迁移的可能性,因此了解其他驱动程序如何处理这一点也很好)
# 1 楼答案
写了一个快速的例子,用MySQL在本地测试这个问题(请原谅错误的异常处理):
testtable是一个非常简单的表:
语句执行后,似乎也是我测试的正确答案。在不同的驱动程序中可能会有不同的方式,但我认为在执行查询之前关闭
InputStream
的情况下,任何情况都不会起作用。在浏览了MySQL的PreparedStatement的源代码之后,它看起来非常简单;它需要打开流来调用sendPacket()
(在执行实际执行的hood方法下),但是在executeUpdate()
完成后,流对象看起来是空闲的我认为您可以安全地假设,这种行为在几乎任何实现JDBC规范的驱动程序中都是一致的。可能会有一些例外,但如果它们支持
InputStream
,它应该以同样的方式工作