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