用JDBC连接SQL数据库,同时查询多个存储过程时报TDS协议流无效的异常与下图中用JDBC连接mysql数据库,同时查询多个存储过程报的Operation not allowed after ResultSet closed异常是一样。
存储过程的执行结果是按照特定格式放在ResultSet里解析的,这个格式就是查询结果的格式。如果存储过程执行时遇见它的查询操作被其他进程占用时,就无法正确返回,而是返回错误的代码或是乱码。在执行rs.next()时就会抛出异常。
出现这个报错主要是因为代码在查询存储过程时ResultSet被关闭导致查询未开始或者查询未完成使得返回数据异常导致的。在编程的时候,我们会把连接数据库常用的Connection、PreparedStatement和ResultSet声明为全局变量来减少代码量,而导致这个报错出现的关键就在这里。在同时查询多个存储过程时,每个方法执行时都会调用到它们,也就是说每个方法调用的都是同一个Connection、PreparedStatement和ResultSet,查询完成时我们是要把这些数据库连接关闭的,当这些查询方法中的其中一个查询完成时就会把Connection、PreparedStatement和ResultSet都close,这时候其他的查询可能有还未开始的或者有正在查询的,但是由于ResultSet的关闭而导致全部的查询过程都被终止,最后返回来的结果要么是乱码,要么是不全,要么是没有值,所以就报了这样的错。
知道问题所在之后解决起来就很容易了,把Connection、PreparedStatement和ResultSet声明在查询方法的里面,让每个查询方法调用的都是独立存在互不影响的就可以解决这个报错了。下图的代码执行完了之后用了两次close来关闭,这里用一次关闭也行,根据代码需求来。
虽然这个报错是ResultSet异常返回而导致的
下面这段查询代码是用来获取下拉框数据的,在页面中有四个下拉框需要同时访问数据库获取数据进行绑定,在这里即使调用的是同一个封装方法也不会报上述的错误。