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/

Reply via email to