Hi,

Will this example run well? Or it will throw an exception because you have 
another stmt.executeQuery() in the while-loop and the rs will be closed?

I've checked the source code of mysql-jdbc, it seems that it will really close 
all the opened ResultSets in execute function. However, I think one statement 
hold for more than one ResultSets is ok. It is like that one connection can 
have multiple statements. It is just implementation difference.


> -----原始邮件-----
> 发件人: "″ 等灯.等灯`" <[email protected]>
> 发送时间: 2019-11-06 18:52:38 (星期三)
> 收件人: dev <[email protected]>
> 抄送: 
> 主题: Re: (IOTDB-291) Statement close operation may cause the whole 
> connection's resource to be released
> 
> hi tiany,
> i am so sorry , my english is poor!
> Connection conn = null;
> &nbsp; Statement stmt = null;
> &nbsp; conn = .......;
> &nbsp; stmt = conm.createStatement(xxxxxx);
> &nbsp; ResultSet rs = stmt.executeQuery(sql1);
> &nbsp; while(rs.next()){
> &nbsp; &nbsp; str = rs.getString(xxxxx);
> &nbsp; &nbsp; ResultSet rs1 = stmt. stmt.executeQuery(\"select * from 
> anyTable&nbsp;where any=str\");
> &nbsp; }
> 
> 
> it's true?
> 
> 发自我的iPhone
> 
> 
> ------------------ Original ------------------
> From: 田原 <[email protected]&gt;
> Date: Wed,Nov 6,2019 6:34 PM
> To: dev <[email protected]&gt;
> Subject: Re: (IOTDB-291) Statement close operation may cause the whole 
> connection's resource to be released
> 
> 
> 
> Hi, Liu
> 
> You mean at the same time, one statement can only hold one ResultSet in 
> mysql-jdbc?
> 
> 
> &gt; -----原始邮件-----
> &gt; 发件人: "″ 等灯.等灯`" <[email protected]&gt;
> &gt; 发送时间: 2019-11-06 17:41:28 (星期三)
> &gt; 收件人: dev <[email protected]&gt;
> &gt; 抄送: 
> &gt; 主题: 回复: (IOTDB-291) Statement close operation may cause the whole 
> connection's resource to be released
> &gt; 
> &gt; hi&amp;nbsp;tiany,&amp;nbsp;
> &gt; in&amp;nbsp;cluster, how to save the&amp;nbsp;statementId Map, and how 
> to releases the resources corresponding of&amp;nbsp;queryIds ,&amp;nbsp;
> &gt; i see mysql jdbc when call execute(sql) method , it will 
> to&amp;nbsp;implicitlyCloseAllOpenResults ,why not&amp;nbsp;refer to this?
> &gt; you want the client nested call ?
> &gt; ------------------&amp;nbsp;原始邮件&amp;nbsp;------------------
> &gt; 发件人:&amp;nbsp;"田原"<[email protected]&amp;gt;;
> &gt; 发送时间:&amp;nbsp;2019年11月6日(星期三) 下午5:13
> &gt; 收件人:&amp;nbsp;"dev"<[email protected]&amp;gt;;
> &gt; 
> &gt; 主题:&amp;nbsp;Re: (IOTDB-291) Statement close operation may cause the 
> whole connection's resource to be released
> &gt; 
> &gt; 
> &gt; 
> &gt; Hi,
> &gt; 
> &gt; I have solved the issued by maintaining a ThreadLocal<Map<Long, 
> Set<Long&amp;gt;&amp;gt;&amp;gt; in the TSServiceImpl which is a map 
> (statementId -&amp;gt; all queryIds in that statement).
> &gt; 
> &gt; Every time the statement is closed, all the queryIds in that map should 
> also be closed.
> &gt; However, when a ResultSet is closed, it only releases the resources 
> corresponding to that queryId.
> &gt; When the connection is closed, the function closeSession() is invoked, 
> it will release all the resource saved in that session thread.
> &gt; 
> &gt; The PR link is https://github.com/apache/incubator-iotdb/pull/526.
> &gt; 
> &gt; 
> &gt; &amp;gt; -----原始邮件-----
> &gt; &amp;gt; 发件人: "Yuan Tian (Jira)" <[email protected]&amp;gt;
> &gt; &amp;gt; 发送时间: 2019-11-05 22:53:00 (星期二)
> &gt; &amp;gt; 收件人: [email protected]
> &gt; &amp;gt; 抄送: 
> &gt; &amp;gt; 主题: [jira] [Created] (IOTDB-291) Statement close operation may 
> cause the whole connection's resource to be released
> &gt; &amp;gt; 
> &gt; &amp;gt; Yuan Tian created IOTDB-291:
> &gt; &amp;gt; -------------------------------
> &gt; &amp;gt; 
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  Summary: Statement close operation may cause the whole connection's resource 
> to be released
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  Key: IOTDB-291
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  URL: https://issues.apache.org/jira/browse/IOTDB-291
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  Project: Apache IoTDB
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  Issue Type: Bug
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  Reporter: Yuan Tian
> &gt; &amp;gt; 
> &gt; &amp;gt; 
> &gt; &amp;gt; The function closeClientOperation() in IoTDBStatement.java 
> invokes the function closeOperation(TSCloseOperationReq) in TSServiceImpl. 
> &gt; &amp;gt; Because the queryId field in TSCloseOperationReq is set to be 
> -1L, the releaseQueryResource&amp;nbsp; function will release all the 
> resources&amp;nbsp; in that connection.
> &gt; &amp;gt; 
> &gt; &amp;gt; {code:java}
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp; private void closeClientOperation() throws 
> SQLException {
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if 
> (operationHandle != null) {
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  TSCloseOperationReq closeReq = new TSCloseOperationReq(operationHandle, -1);
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  closeReq.setStmtId(stmtId);
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  TSStatus closeResp = client.closeOperation(closeReq);
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  RpcUtils.verifySuccess(closeResp);
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
> throw new SQLException("Error occurs when closing statement.", e);
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp; }
> &gt; &amp;gt; {code}
> &gt; &amp;gt; 
> &gt; &amp;gt; {code:java}
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp; private void 
> releaseQueryResource(TSCloseOperationReq req) throws StorageEngineException {
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map<Long, 
> QueryContext&amp;gt; contextMap = contextMapLocal.get();
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (contextMap == null) 
> {
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
> return;
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (req == null || 
> req.queryId == -1) {
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 
> end query for all the query tokens created by current thread
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for 
> (QueryContext context : contextMap.values()) {
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  QueryResourceManager.getInstance().endQueryForGivenJob(context.getJobId());
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
> contextMapLocal.set(new HashMap<&amp;gt;());
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
> QueryResourceManager.getInstance()
> &gt; 
> &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
>  .endQueryForGivenJob(contextMap.remove(req.queryId).getJobId());
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
> &gt; &amp;gt;&amp;nbsp;&amp;nbsp; }
> &gt; &amp;gt; {code}
> &gt; &amp;gt; 
> &gt; &amp;gt; 
> &gt; &amp;gt; 
> &gt; &amp;gt; 
> &gt; &amp;gt; --
> &gt; &amp;gt; This message was sent by Atlassian Jira
> &gt; &amp;gt; (v8.3.4#803005)

Reply via email to