相信很少使用这个方法,其实这个方法是用来返回Statement当前打开过的ResultSet,以代码举例

ResultSet rs1= statement.executeQuery(".....");

ResultSet rs2= statement.getResultSet();

System.out.println(rs1==rs2);//结果是true

还有一个方法:statement.execute(".....");这个方法返回的结果是一个Boolean值,如果执行一条查询语句,那么可以通过Statement.getResultSet()来获得结果对像,这个execute方法是有可能返回多条ResultSet结果(主要看驱动是否支持), 是否有下一个结果集,可以通过使用方法:getMoreResults和 getMoreResults(int current)来判定,通常情况下Statement如果打开多条ResultSet那么只保留最后一个,并关闭前面的。getMoreResults这个方法有三个可选变量输入,从而决定是否关闭,还是继续保持已打开过ResultSet,请看下图的JDBC规范定义

光连接池缺陷-对于Statement.getResultSet()的一点理解-LMLPHP

总结一下

1:Statement.getResultSet()可以获得当前打开过ResultSet对像

2:在未执行过SQL的时候,Statement.getResultSet()理论值是空

3:Statement.getResultSet()在Statement.execute()的情况下是有可能获得多个结果集

4:如果存在多个结果集,是否关闭已经打开过的,主要驱动的关闭策略代码(体现getMoreResults(int current)

继续使用光链池测试一下,代码如下:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class TestPreparedStatementOnHikaCP {

    public static void main(String[] args) {
        try {
            HikariConfig config2 = new HikariConfig();
            config2.setJdbcUrl("jdbc:mysql://localhost/test?serverTimezone=UTC");
            config2.setDriverClassName("com.mysql.cj.jdbc.Driver");
            config2.setUsername("root");
            config2.setPassword("");
            config2.setAutoCommit(false);
            config2.addDataSourceProperty("cachePrepStmts", "true");
            config2.addDataSourceProperty("useServerPrepStmts", "true");
            HikariDataSource ds = new HikariDataSource(config2);

            ResultSet rs=null;
            PreparedStatement pst=null;
            Connection con = null;
            try {
                con = ds.getConnection();
                pst=con.prepareStatement("select * from BEECP_TEST");
                System.out.println("未执行SQL前1:"+pst.getResultSet());
                System.out.println("未执行SQL前2:"+pst.getResultSet());
                System.out.println("未执行SQL前3:"+pst.getResultSet());
                rs=pst.executeQuery();
                System.out.println("执行SQL后1:"+pst.getResultSet());
                System.out.println("执行SQL后2:"+pst.getResultSet());
                System.out.println("执行SQL后3:"+pst.getResultSet());

                System.out.println("打印通过executeQuery获得的结果对像:"+rs);
                System.out.println("已执行SQL,两个对像是否相等:"+(pst.getResultSet()==rs));

                /**
                 * 依赖包:
                 * 1:HikariCP-3.4.5.jar
                 * 2:mysql-connector-java-8.0.16.jar
                 */
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (rs != null)
                    rs.close();
                if (pst != null)
                    pst.close();
                if (con != null)
                    con.close();
            }
            ds.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果截图

光连接池缺陷-对于Statement.getResultSet()的一点理解-LMLPHP

可以从测试结果上很明显看到SQL执行后两个方法的获得ResultSet并不相等,但包了同一个物理对像

statement.executeQuery() != statement.getResultSet();

从这个实现方法来上讲,光连接池是没有遵循规范

05-01 04:30
查看更多