用这两个东西用了很久了,但是一直没有弄明白他们低层的怎么搞的
而且在写程序的时候,如果这两个东西没有处理好,都是出现大问题在这里我想先谈谈自己对这个的理解
Connection相当于一个连接,每一次访问一个数据库都会产生一个连接
Statement就相当于一个指针....但是具体怎么形容我也不清楚
相关的ResultSet这个就比较简单了,就是一个结果集,不关闭是会浪费资源,但是java的回收机制不会帮忙清理吗?应该也会的吧?让我疑惑的东西就是close了...ResultSet的关闭我知道是释放内存,释放资源但是Statement和Connection的关闭就一直不是很清楚了.
而且Statement在每次执行到另外一个update或者query的时候,以前的那个结果集都会被关闭掉的Connection,为什么要关呢?一个数据库不允许太多的链接吗?
对于数据源的链接一般也就只有几十个,为什么要这样设置呢?希望能够得到比较低层,耐心以及形象的回答.衷心的感谢

解决方案 »

  1.   

    现代数据库都是采用 Client/Server 模式进行设计的,数据库服务器作为服务端,各种连接数据库的都称为客户端,比如 JDBC、MySQL-Front、MS SQL Sever 的查询分析器、Oracle 的 SQL PLUS 等等。JDBC 的 Connection 客户端与数据库服务器之间是采用 TCP 协议进行通信的。握手完成,通道建立后,用完了就要关掉,如果用完了不关的话,并且是每连一次创建一个的话,会造成数据库服务器建立了大量的客户端连接,如果建的连接很多很多的话,会直接导致数据库性能下降。一般来说数据库服务器都有客户端最大的连接数量限制,数据库服务器也不会傻到无穷无尽地与客户端建立连接。因此为了减轻数据库服务端的压力,应该及时关闭 TCP 连接通道。Connection 与数据库服务器之间建立 TCP 通道之后,还得向数据库服务器发送认证请求,数据库必须验证这个认证请求,认证通过后再告诉 Connection 说你的认证通过了,可以向我发出请求了。可见一个 Connection 的建立需要经过一个很漫长的过程,特别是数据库服务器不在同一台机器的时候,会更加漫长,如果我们把好不容易费了半天周折建立起来的 Connection 就执行一个简单的 SELECT 就关掉的话,想想看都觉得可惜,你说是不?一般 Connection 采用资源池模式(资源池模式是 J2EE 设计模式中重要的设计模式)进行数据库连接管理,我们与数据库打了 N 多交道建立起来的 Connection,在我们执行完一个数据库操作之后,并不是马上把这个通道给关闭掉,而是还回池中去,以便于这个 Connection 能为下一次数据库操作进行服务。采用资源池管理的 Connection 的话,达到了很好的性能,除了第一次花费时间去打开 Connection 通道之后后面并不需要再去打开通道了,因为这个通道并没有关闭。如果资源池中的 Connection 数量设置为最大 20 个的话,那么无论有多少数据库操作,就是仅仅使用这 20 个连接池。最后说一下资源池中 Connection 的东西,一般而言数据库服务器如果长时间与客户端连接着的话,数据库服务器会主动断开这个客户端连接(JDBC 也是数据库服务器的客户端),如果是这样的话,很有可能在资源池中的 Connection 会被动断开连接,如果正好某一个断开,而被取出来用的话,就会报错。嘿嘿,实际上我们在使用开源的数据库连接池中并不会发生这种问题,因为连接池管理对象中会定期刷新连接池中连接的健康状态,如果连接超时的话,就将之抛弃,绝对不会让使用者得到这个被数据库回收的连接。
      

  2.   

    Connection 在执行 close() 方法时,会回收一切与之关联的对象,包括 Statement 和 ResultSet。close() 中会通知数据库,我要关闭与你的连接了,如果得到数据库的确认后,会关闭与数据库之间的 TCP 通道,清空数据、再由 JVM 回收、操作系统回收分配出去的端口号。在数据库服务器端,会断开与这个客户端的连接,回收与之建立的连接。