Hello! Why do you have setQueryTimeout here? What happens if you take it off?
Regards, -- Ilya Kasnacheev ср, 5 дек. 2018 г. в 09:17, yangjiajun <[email protected]>: > Hello. > > I think I get a reproducer for this issue: > > 1.Start a node with persistence enabled. > 2.Create a table:CREATE TABLE city (id LONG PRIMARY KEY, name VARCHAR) WITH > "template=replicated" > 3.Insert 8W random records to it. > 4.Create two jdbc thin connections. > 5.Start two threads using different connection repeatedly to do sacn query > and iterate the result set. > 6.Then u can see the exception for a while. > > Note:U can get the exception more easily when u set threadPoolSize of > clientConnectorConfiguration to 1. > > Here is my test code: > > import java.sql.Connection; > import java.sql.DriverManager; > import java.sql.ResultSet; > import java.sql.ResultSetMetaData; > import java.sql.SQLException; > import java.sql.Statement; > import java.util.Properties; > > public class StatementTest { > > private static Connection conn; > private static Connection conn1; > > public static void main(String[] args) throws Exception { > > initialize(); > > String selectSql = "SELECT * FROM city"; > testQuery(selectSql); > while(true){ > > } > } > > public static void close() throws Exception { > conn.close(); > } > > public static void initialize() throws Exception { > Class.forName("org.apache.ignite.IgniteJdbcThinDriver"); > final String dbUrl = > > "jdbc:ignite:thin://ip:port;lazy=true;skipReducerOnUpdate=true;replicatedOnly=true"; > final Properties props = new Properties(); > conn = DriverManager.getConnection(dbUrl, props); > conn1= DriverManager.getConnection(dbUrl, props); > //initData(); > } > > private static void initData() throws SQLException{ > for(int i=0;i<80000;i++){ > String s=String.valueOf(Math.random()); > conn.prepareStatement("insert into city(id,name) > VALUES("+i+","+s+")").execute(); > } > } > > public static void testQuery(final String sql) throws Exception { > > new Thread(new Runnable() { > > @Override > public void run() { > long startTime=System.currentTimeMillis(); > while(true){ > > try (Statement stmt = > conn.createStatement()) { > try (ResultSet rs = > stmt.executeQuery(sql)) { > > ResultSetMetaData > rsmd = rs.getMetaData(); > int colCount = > rsmd.getColumnCount(); > int count = 1; > try{ > while > (rs.next()) { > > System.out.print("conn "); > > for (int i = 1; i <= colCount; i++) { > > System.out.print(rsmd.getColumnName(i) + ":" + rs.getObject(i) + " > "); > } > > System.out.println(count); > > count++; > } > }catch(Exception > e){ > > e.printStackTrace(); > > System.out.println(System.currentTimeMillis()-startTime); > > System.out.println(e); > > System.out.println(rs.isClosed()); > > System.out.println(stmt.isClosed()); > > System.out.println(conn.isClosed()); > > System.exit(-1); > } > > System.out.println("test"); > > } > }catch (Exception e) { > System.out.println(e); > } > } > } > }).start(); > > new Thread(new Runnable() { > > @Override > public void run() { > long startTime=System.currentTimeMillis(); > while(true){ > > try (Statement stmt = > conn1.createStatement()) { > try (ResultSet rs = > stmt.executeQuery(sql)) { > > ResultSetMetaData > rsmd = rs.getMetaData(); > int colCount = > rsmd.getColumnCount(); > int count = 1; > try{ > while > (rs.next()) { > > System.out.print("conn1 "); > > for (int i = 1; i <= colCount; i++) { > > System.out.print(rsmd.getColumnName(i) + ":" + rs.getObject(i) + " > "); > } > > System.out.println(count); > > count++; > } > }catch(Exception > e){ > > e.printStackTrace(); > > System.out.println(System.currentTimeMillis()-startTime); > > System.out.println(e); > > System.out.println(rs.isClosed()); > > System.out.println(stmt.isClosed()); > > System.out.println(conn.isClosed()); > > System.exit(-1); > } > > System.out.println("test"); > > } > }catch (Exception e) { > System.out.println(e); > } > } > } > }).start(); > > } > } > > > > > ilya.kasnacheev wrote > > Hello! > > > > Can you provide logs from your nodes prior to seeing this exceptions? > > > > Note that in a distributed system, you can expect to see this problem > > sometimes, i.e. to see a large lazy result set fail in mid-iteration due > > to > > some changes in the cluster. I'm not sure if there's nothimg more > specific > > here, though. > > > > Regards, > > -- > > Ilya Kasnacheev > > > > > > пн, 3 дек. 2018 г. в 06:21, yangjiajun < > > > 1371549332@ > > >>: > > > >> Hello. > >> > >> The error does not happen every time because it disappears when we > >> restart > >> our application.But it repeats when first error appears.The row number > is > >> not fixed when this error happens.We are really confused about this > >> exception. > >> > >> > >> ilya.kasnacheev wrote > >> > Hello! > >> > > >> > Does this happen every time? If so, which is the # of row on which it > >> will > >> > happen? > >> > > >> > Regards, > >> > -- > >> > Ilya Kasnacheev > >> > > >> > > >> > вт, 27 нояб. 2018 г. в 10:09, yangjiajun < > >> > >> > 1371549332@ > >> > >> >>: > >> > > >> >> Hello. > >> >> > >> >> I did a scan query on a table which has 8w records and tried to go > >> >> through > >> >> all records in the result set but got following exception: > >> >> > >> >> [13:53:31,523][SEVERE][client-connector-#77][JdbcRequestHandler] > >> Failed > >> >> to > >> >> fetch SQL query result [reqId=0, req=JdbcQueryFetchRequest > >> >> [queryId=38106237, pageSize=1024]] > >> >> class org.apache.ignite.internal.processors.query.IgniteSQLException: > >> The > >> >> object is already closed [90007-195] > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.query.h2.H2ResultSetIterator.fetchNext(H2ResultSetIterator.java:136) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.query.h2.H2ResultSetIterator.onHasNext(H2ResultSetIterator.java:142) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.query.GridQueryCacheObjectsIterator.hasNext(GridQueryCacheObjectsIterator.java:61) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.odbc.jdbc.JdbcQueryCursor.fetchRows(JdbcQueryCursor.java:72) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequestHandler.fetchQuery(JdbcRequestHandler.java:587) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequestHandler.handle(JdbcRequestHandler.java:206) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:160) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:44) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.util.nio.GridNioFilterChain$TailFilter.onMessageReceived(GridNioFilterChain.java:279) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.util.nio.GridNioFilterAdapter.proceedMessageReceived(GridNioFilterAdapter.java:109) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.util.nio.GridNioAsyncNotifyFilter$3.body(GridNioAsyncNotifyFilter.java:97) > >> >> at > >> >> > >> > org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.util.worker.GridWorkerPool$1.run(GridWorkerPool.java:70) > >> >> at > >> >> > >> >> > >> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) > >> >> at > >> >> > >> >> > >> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) > >> >> at java.lang.Thread.run(Thread.java:748) > >> >> Caused by: org.h2.jdbc.JdbcSQLException: The object is already closed > >> >> [90007-195] > >> >> at > >> >> org.h2.message.DbException.getJdbcSQLException(DbException.java:345) > >> >> at org.h2.message.DbException.get(DbException.java:179) > >> >> at org.h2.message.DbException.get(DbException.java:155) > >> >> at org.h2.message.DbException.get(DbException.java:144) > >> >> at > >> org.h2.jdbc.JdbcResultSet.checkClosed(JdbcResultSet.java:3208) > >> >> at org.h2.jdbc.JdbcResultSet.next(JdbcResultSet.java:130) > >> >> at > >> >> > >> >> > >> > org.apache.ignite.internal.processors.query.h2.H2ResultSetIterator.fetchNext(H2ResultSetIterator.java:110) > >> >> ... 17 more > >> >> > >> >> My ignite version is 2.6 and I only started one node.I did not call > >> any > >> >> close methods. Why ignite closed my result set? > >> >> > >> >> Here is my test code: > >> >> > >> >> import java.sql.Connection; > >> >> import java.sql.DriverManager; > >> >> import java.sql.ResultSet; > >> >> import java.sql.ResultSetMetaData; > >> >> import java.sql.Statement; > >> >> import java.util.Properties; > >> >> > >> >> public class StatementTest { > >> >> > >> >> private static Connection conn; > >> >> > >> >> > >> >> public static void main(String[] args) throws Exception { > >> >> > >> >> long t1 = System.currentTimeMillis(); > >> >> try { > >> >> initialize(); > >> >> > >> >> String selectSql = "SELECT * FROM > >> >> table_6932_r_1_1"; > >> >> testQuery(selectSql); > >> >> } catch (Exception e) { > >> >> throw e; > >> >> } finally { > >> >> if (conn != null) > >> >> conn.close(); > >> >> } > >> >> long t2 = System.currentTimeMillis(); > >> >> System.out.println("operation costs " + (t2 - t1) + " > >> >> ms"); > >> >> } > >> >> > >> >> public static void close() throws Exception { > >> >> conn.close(); > >> >> } > >> >> > >> >> public static void initialize() throws Exception { > >> >> > >> Class.forName("org.apache.ignite.IgniteJdbcThinDriver"); > >> >> String dbUrl = > >> >> > >> >> > >> > "jdbc:ignite:thin://ip:port;lazy=true;skipReducerOnUpdate=true;replicatedOnly=true"; > >> >> conn = DriverManager.getConnection(dbUrl, props); > >> >> } > >> >> > >> >> public static void testUpdate(String sql) throws Exception { > >> >> try (Statement stmt = conn.createStatement()) { > >> >> stmt.setQueryTimeout(10); > >> >> stmt.executeUpdate(sql); > >> >> } > >> >> } > >> >> > >> >> public static void testQuery(String sql) throws Exception { > >> >> long startTime=System.currentTimeMillis(); > >> >> try (Statement stmt = conn.createStatement()) { > >> >> //stmt.setQueryTimeout(10); > >> >> try (ResultSet rs = stmt.executeQuery(sql)) { > >> >> > >> >> ResultSetMetaData rsmd = > >> >> rs.getMetaData(); > >> >> int colCount = rsmd.getColumnCount(); > >> >> int count = 1; > >> >> try{ > >> >> while (rs.next()) { > >> >> //Thread.sleep(10); > >> >> > >> >> for (int i = 1; i <= > >> >> colCount; i++) { > >> >> > >> >> System.out.print(rsmd.getColumnName(i) + ":" + rs.getObject(i) + " > >> >> "); > >> >> } > >> >> > >> >> System.out.println(count); > >> >> count++; > >> >> } > >> >> }catch(Exception e){ > >> >> > >> >> System.out.println(System.currentTimeMillis()-startTime)); > >> >> > >> >> System.out.println(rs.isClosed()); > >> >> > >> >> System.out.println(stmt.isClosed()); > >> >> > >> >> System.out.println(conn.isClosed()); > >> >> } > >> >> > >> >> } > >> >> } > >> >> } > >> >> } > >> >> > >> >> > >> >> > >> >> -- > >> >> Sent from: http://apache-ignite-users.70518.x6.nabble.com/ > >> >> > >> > >> > >> > >> > >> > >> -- > >> Sent from: http://apache-ignite-users.70518.x6.nabble.com/ > >> > > > > > > -- > Sent from: http://apache-ignite-users.70518.x6.nabble.com/ >
