相关疑难解决方法(0)

Statement.setFetchSize(nSize)方法在SQL Server JDBC驱动程序中的作用是什么?

我有这个非常大的桌子,每天有数百万条记录,每天结束时我都会提取前一天的所有记录.我这样做:

String SQL =  "select col1, col2, coln from mytable where timecol = yesterday";
Statement.executeQuery(SQL);
Run Code Online (Sandbox Code Playgroud)

问题是这个程序需要2GB的内存,因为它会将所有结果都记在内存中然后处理它.

我尝试设置Statement.setFetchSize(10)但它从操作系统获取完全相同的内存它没有任何区别.我正在使用Microsoft SQL Server 2005 JDBC驱动程序.

有没有办法以小块的形式读取结果,比如Oracle数据库驱动程序执行查询时只显示几行,当你向下滚动时会显示更多结果?

java sql-server jdbc

52
推荐指数
4
解决办法
9万
查看次数

为什么Microsoft SQL Server 2012查询需要几分钟而不是JDBC 4.0,而在Management Studio中需要几分钟?

我正在处理ResultSet从远程Microsoft SQL Server 2012到使用Microsoft JDBC Driver 4.0的Java客户端检索相对较大的性能问题.

当我在远程服务器的Microsoft SQL Server Management Studio上运行相应的查询时,它返回约.220k行几乎瞬间完成.当我从客户端发出相同的查询时,它会停止.同样的测试在客户端上运行良好,早期版本的数据库只有大约.400行合格.

我尝试通过附加;responseBuffering=adaptive"到传递给的URL 来解决这个问题DriverManager.getConnection().建立连接后,我在结果中看到了这个属性(以及其他几个)connection.getMetaData().getURL(),但是[ connection.getClientInfo(responseBuffering)返回null,而且客户端仍然停滞不前.

这里可能出现什么问题,如何指示Microsoft SQL Server(不仅仅是以Java编程方式建议)它必须以较小的块而不是一次性返回行,或者通过其他一些措施来改进JDBC查询时间.

两个进一步的观察似乎有点奇怪,可能完全指向不同的根本原因:

  • 当客户端停止时,它仍然只显示相对较轻的CPU负载,这与我对重垃圾收集的期望不同
  • "responseBuffering =自适应"应在正常默认由现在

更新我已经检查过,发现在我的情况下切换PreparedStatementStatement没有改善的东西(显然在其他情况下可以帮助).

更新这是我当前的查询:

select 
    PARENT.IDENTIFIER    as PARENT_IDENTIFIER,
    PARENT.CLASS         as PARENT_CLASS,
    CHILD.TYPE           as CHILD_TYPE,
    CHILD.IDENTIFIER     as CHILD_IDENTIFIER,
    PROPERTY.IDENTIFIER  as PROPERTY_IDENTIFIER,
    PROPERTY.DESCRIPTION as PROPERTY_DESCRIPTION,
    PROPERTY.TYPE        as PROPERTY_TYPE,
    PROPERTY.PP          as PROPERTY_PP,
    PROPERTY.STATUS      as PROPERTY_STATUS,
    PROPERTY.TARGET      as PROPERTY_TARGET -- a date
from …
Run Code Online (Sandbox Code Playgroud)

java sql-server jdbc sql-server-2012

9
推荐指数
1
解决办法
7474
查看次数

标签 统计

java ×2

jdbc ×2

sql-server ×2

sql-server-2012 ×1