有谁清楚JDBC驱动和数据库之间交互的细节吗比如:当用只读(CONCUR_READ_ONLY)、快进(TYPE_FORWARD_ONLY )的方式从数据库读取记录时,为什么对于较大的结果集,性能不佳?为什么用fetch_size可以调节性能?这儿的性能是指:JDBC驱动的内存消耗、还是数据库服务器的内存消耗、还是读取时间、还是对其他的Statement的操作有影响?也就是,JDBC驱动和数据库之间的后台的数据交互格式、交互过程是怎样的?

解决方案 »

  1.   

    因为对于客户端来说,不管结果集有多大、或者多小,都是通过ResultSet.next来一条一条取出来的。结果集很大的时候影响什么呢??是JDBC驱动在执行 Statement.executeQuery的时候,会把所有结果集全部读到内存里,然后才返回,因此内存耗用大??还是仍然也是在next的时候才读取的??那么这时候会影响什么呢?其他的Statement无法和Server通信吗??每一个Statement都是一个独立的Socket吗?大数据集究竟是如何从 数据库服务器 发送到 JDBC驱动的呢?是怎样分批?或者一次性发送的呢?
      

  2.   

    jdbc是一种规范。jdbc应该传输给java虚拟机,通过java虚拟机中的socket来与远程的数据库进行通信。jdbc不应该调用java中的socket,而应该调用虚拟机中的socket与数据库接口通信。
        lz同意我这样的看法吗?我现在在研究java同数据库的通信,自己认为是这样。其他朋友还有什么看法呢?
      

  3.   

    用链接池试试,能不能改善性能。
    我觉得它肯定是有优化算法的,jdbc不会为了一次next进行一次数据获取。
    一定是按照一定大小批量获取数据的。当然这个数据实现已经由query语句在server端准备好。
      

  4.   

    ResultSet 是在真正在使用时才真正从数据库里获得数据
      

  5.   

    回答一个不知道有没有错误,对于jdbc来说在和数据库交互的时候就是建立链接和释放链接的过程,在这过程中如果结果集较小或者连接对象较少是没有问题的,但是想像一下这种情况:   你到肯德基去买东西你去要一个服务员给你请求一个,这样不光要给你汉堡还要收钱还要通知师傅给你作汉堡,你走了还要通知师傅他不要再做了.然后我们用一种方法叫做"连接池",意思就是:
      你到肯德基去买东西,她看到你的单,顺手从后面的池子<去过的应该知道>里面给你拿一个,她也不管你要多大的,你什么时候来,提前给你在池子里面放了很多的连接等你来拿,是不是速度快了?
      

  6.   

    要调节性能lz也可以自己建立连接池代码!重要的是大家清楚jdbc驱动程序的底层实现环节吗?我也正想问这一问题?
      

  7.   

    连接池所做的工作就是初始化很多个连接,对这些连接进行管理。
    以往的方式是打开连接,执行sql,然后关闭连接。
    再次访问数据库的时候需要再次打开连接,执行sql,然后关闭连接。连接池所打开的连接其实是不关闭的。
    当程序调用数据库访问的时候,他会找一个空闲的连接给程序使用。
    这样就省去频繁打开连接,关闭链接的操作,这个操作是很费效率和资源的。
    对于搂主的问题,我觉得有实际意义吗?要考虑性能的话,也不应该是这种问题。
    我很难明白搂主搞懂这个要做什么?
      

  8.   

    JDBC与底层数据库的交换格式每个数据库是不同的,与底层数据库是通过TCP/IP协议进行交互的。