Java 对于Azure SQL,对于大字符串,ResultSet.getString()非常慢

Java 对于Azure SQL,对于大字符串,ResultSet.getString()非常慢,java,sql-server,jdbc,azure-sql-database,mssql-jdbc,Java,Sql Server,Jdbc,Azure Sql Database,Mssql Jdbc,我正在使用Microsoft SQL Server JDBC驱动程序从Azure SQL数据库查询数据。我正在使用ResultSet.getString从我的一个表中提取一个大的JSON字符串,该方法的性能——对于同一条记录——在整个映射中都是如此。从1秒到一分钟或更长时间 我获取的JSON大约是10-15MB,因此我怀疑这与此有很大关系。我只是对表现的极端波动感到困惑。您认为这可能是Java堆空间/GC问题吗?或者它可能与getString方法的实际工作方式有关吗 我的实际查询性能一直非常好,

我正在使用Microsoft SQL Server JDBC驱动程序从Azure SQL数据库查询数据。我正在使用ResultSet.getString从我的一个表中提取一个大的JSON字符串,该方法的性能——对于同一条记录——在整个映射中都是如此。从1秒到一分钟或更长时间

我获取的JSON大约是10-15MB,因此我怀疑这与此有很大关系。我只是对表现的极端波动感到困惑。您认为这可能是Java堆空间/GC问题吗?或者它可能与getString方法的实际工作方式有关吗

我的实际查询性能一直非常好,不到1秒就可以从服务器获取这个大数据库的多行

代码段:

ResultSet rs = pstmt.executeQuery();
if (azureLogging) {
    System.out.println("Azure log: GetCustomerTariffs:" + new Date().toString() + " : query finished");
}
tariffs = new ArrayList<CustomerTariff>();

while (rs.next()) {
    System.out.println("Azure log: GetCustomerTariffs:" + new Date().toString() + " : getting JSON");

    jsonStr = rs.getString("tariff_json");
    System.out.println("Azure log: GetCustomerTariffs:" + new Date().toString() + " : got JSON");
    System.out.println(rs.getString("company_no") + ", " + rs.getString("scac"));
    System.out.println("Azure log: GetCustomerTariffs:" + new Date().toString() + " : deserializing JSON");
    CustomerTariff tariff =  respGson.fromJson(jsonStr, CustomerTariff.class);
    System.out.println("Azure log: GetCustomerTariffs:" + new Date().toString() + " : JSON deserialized");

    tariffs.add(tariff);
}
ResultSet rs=pstmt.executeQuery();
if(azureLogging){
System.out.println(“Azure日志:GetCustomerTariff:+new Date().toString()+”:查询完成”);
}
关税=新的ArrayList();
while(rs.next()){
System.out.println(“Azure日志:GetCustomerTariff:+new Date().toString()+”:获取JSON”);
jsonStr=rs.getString(“tariff_json”);
System.out.println(“Azure日志:GetCustomerTariff:+new Date().toString()+”:Get JSON”);
System.out.println(rs.getString(“公司编号”)+,“+rs.getString(“scac”));
System.out.println(“Azure日志:GetCustomerTariff:+new Date().toString()+”:反序列化JSON”);
CustomerTariff关税=respGson.fromJson(jsonStr,CustomerTariff.class);
System.out.println(“Azure日志:GetCustomerTariff:+new Date().toString()+”:JSON反序列化”);
关税。添加(关税);
}

更新:
参数嗅探可能会导致查询速度变慢,因此,我们可以找到并解决参数嗅探问题


  • 我认为您应该首先使用查看工作负载中最消耗资源和长时间运行的查询。你可以

  • 我们还可以在jdbc应用程序中使用连接池来降低打开新连接的成本,并有效地管理资源


  • 人们可能需要更多信息来帮助您:例如您正在使用哪个JDBC驱动程序;您运行的查询;您的表/索引定义。另外,您是如何测量以确定花费的时间最多的是什么,是特定的getString()调用还是所有的getString()调用?com.microsoft.sqlserver mssql jdbc 7.4.1.jre8Hi@Rick Bonnett,我已经更新了我的答案。如果您需要更多信息,请告诉我。:)谢谢你,约瑟夫。我看不出查询性能本身有什么问题——这似乎很好。我的问题是在查询执行完成后调用ResultSet.getString()获取我的大JSON字符串