Hi,

And I find that there are different modes you can choose when you create a 
statement in mysql-jdbc.

If you choose the KEEP_CURRENT_RESULT mode, it can hold more than one results, 
as the following source code shows:

     case java.sql.Statement.KEEP_CURRENT_RESULT:
         if (!this.dontTrackOpenResources.getValue()) {
               this.openResults.add(this.results);
         }

         this.results.clearNextResultset(); // nobody besides us should
         // ever need this value...
         break;


> -----原始邮件-----
> 发件人: "田原" <[email protected]>
> 发送时间: 2019-11-06 19:00:28 (星期三)
> 收件人: [email protected]
> 抄送: 
> 主题: Re: Re: (IOTDB-291) Statement close operation may cause the whole 
> connection's resource to be released
> 
> 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