【发布时间】:2010-10-24 17:20:50
【问题描述】:
什么是 JDBC 中的连接对象?这个连接是如何维护的(我的意思是它是一个网络连接)?它们是 TCP/IP 连接吗?为什么每次都创建一个 Connection 是一项昂贵的操作?为什么这些连接在一段时间后变得陈旧,我需要刷新池?为什么我不能使用一个连接来执行多个查询?
【问题讨论】:
标签: java networking jdbc tcp connection
什么是 JDBC 中的连接对象?这个连接是如何维护的(我的意思是它是一个网络连接)?它们是 TCP/IP 连接吗?为什么每次都创建一个 Connection 是一项昂贵的操作?为什么这些连接在一段时间后变得陈旧,我需要刷新池?为什么我不能使用一个连接来执行多个查询?
【问题讨论】:
标签: java networking jdbc tcp connection
这些连接是 TCP/IP 连接。为了不必每次创建新连接时都产生开销,连接池会动态扩展和收缩。您可以将一个连接用于多个查询。我认为您的意思是您将其释放到池中。如果这样做,您可能会从池中恢复相同的连接。在这种情况下,执行一个或多个查询并不重要
连接的成本是连接需要一些时间。并且数据库为每个连接准备一些东西,比如会话等。每次都必须这样做。由于多种原因,连接变得陈旧。最突出的是介于两者之间的防火墙。连接问题可能导致连接重置或简单的超时
【讨论】:
添加到其他答案:
是的,您可以为多个查询重复使用相同的连接。这甚至是可取的,因为创建新连接非常昂贵。
您甚至可以同时执行多个查询。您只需为每个查询使用一个新的 java.sql.Statement/PreparedStatement 实例。语句是 JDBC 用来跟踪正在进行的查询的,因此每个并行查询都需要自己的语句。不过,您可以并且应该为连续查询重复使用语句。
【讨论】:
您的问题的答案是它们是由实现定义的。 JDBC 连接是公开方法的接口。幕后发生的事情可以是提供界面的任何事情。例如,考虑用于支持 java 存储过程的 Oracle 内部 JDBC 驱动程序。同时查询不仅是可能的,它们或多或少是不可避免的,因为对新连接的每个请求都返回一个也是唯一的连接对象。我不确定它是否在内部使用 TCP/IP,但我对此表示怀疑。
因此,您不应该在不清楚您使用的是哪种 JDBC 实现的情况下假设实现细节。
【讨论】:
因为我还不能发表评论,所以发布答案只是为了评论 Vinegar 的答案,setAutoCommit() 在返回池连接时返回默认状态的情况不是强制性行为,不应被视为理所当然,也应视为关闭语句和结果集;您可以阅读它应该关闭,但如果您不关闭它们,它们将在关闭连接时自动关闭。不要想当然,因为它会占用您在某些版本的 jdbc 驱动程序上的资源。
我们在 AS400 上的 DB2 数据库上遇到了严重问题,需要事务隔离的人正在调用 connection.setAutoCommit(false),在完成工作后,他们在没有 connection.setAutoCommit(old_state) 的情况下将此类连接返回到池 (JNDI),所以当另一个线程从池中得到了这个连接,插入和更新还没有提交,很久没有人弄清楚为什么......
【讨论】: