nebula-contrib / nebula-jdbc

The JDBC connector for Nebula Graph.
41 stars 15 forks source link

Statement无法重复调用问题 #29

Closed PolarBears-DontEat-IceCream closed 2 years ago

PolarBears-DontEat-IceCream commented 2 years ago

同个Statement连续调用 nebulaResultSetMetaData获取到的为同一个,置空的方法没有暴露出来 /* If you want to get MetaData after ResultSet changes, the method below should be called. / public static void release(){ nebulaResultSetMetaData = null; }

By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a current ResultSet object of the statement if an open one exists. 能否参考Statement的隐式关闭,实现可以重复调用

Young-Flash commented 2 years ago

不是很理解,可以描述地更详细一些吗?

PolarBears-DontEat-IceCream commented 2 years ago

您好,抱歉描述得不太清晰。我这边需求是调用两次statement.executequery获取不同的属性和数据。语句如下: String querySql = "match (n:intelligent_device_category) return n.code as code,n.name as name;"; ResultSet resultSet = statement.executeQuery(querySql);

String querySql = "go from '" + vid + "' over has_scene yield $$.scene.name as name ,$$.scene.description as description,$$.scene.demand as demand,$$.scene.support_model as support_model;"; ResultSet resultSet = statement.executeQuery(querySql);

image

获取到的resultset里是对的,但是封装的nebularesultset只要调用一次之后就会一直保存之前的columnnames等信息,导致第二次查询语言的是四个属性,返回来的还是code和name,实际里面的数据是对的。查看了nebulaResultSetMetaData里getInstance里,如果nebuaresultsetmetadata为空才会重新用nebularesultset进行生成操作,但是此变量为静态,在重复调用是一直不为空的,写着有release方法,但是没有对外暴露出来。查看了jdbc的resultset实体,顺序调用statement是会隐式关闭之前的resultset。麻烦查看下问题,谢谢。

Young-Flash commented 2 years ago

NebulaResultSetMetaData.release() 可以调用呀。不知道是不是我没理解你的意思,我尝试了在 statement 执行另一条查询之前调用 release,获得的 ResultSet 和 ResultSetMetaData 都是正确的。

PolarBears-DontEat-IceCream commented 2 years ago

抱歉,是可以调用的,调用后的ResultSet是正确的.