Hi Igniters, I am testing SQL with Ignite. With the following simple tests, queries fails with out-of-memory error, and Ignite is not usable anymore until restart.
It seems Ignite need get all the records to be returned in heap first before transferring data to client side. This can be problematic since even with large heap size, this problem may still happens depend the size of the data to be returned and how many concurrent queries.... In my case, persistent is on for the data region(named as storageWithPersistence); with default heap size (1GB). Here is the simple tests: public class JDBCTestWithTemplate_LargeDataSet { public static void main(String[] args) { int len = 10 * 1204 * 1024; // 10M byte[] binaryData = new byte[len]; for (int i=0; i < len; i++) { binaryData[i] = 1; } Connection conn = null; try{ // Create a JDBC connection conn = TestUtils.prepareIgniteJDBCConnection(args); // Create City table based on FeatureTileCacheTemplateName_1_Day template // This template use a data region with persistent on. executeSQL(conn, "DROP TABLE IF EXISTS CITY "); executeSQL(conn, "CREATE TABLE IF NOT EXISTS CITY (id LONG PRIMARY KEY, val BINARY) " + "with \"TEMPLATE=" + CacheConfigurationTemplates.FeatureTileCacheTemplateName_1_Day+ "\""); String sql = "INSERT INTO CITY (id, val) VALUES(?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); // create some binary data String myData = "Adding test data ..."; // set value for the prepared statement for (int i = 0; i < 1000; i++) { pstmt.setInt(1, i); pstmt.setBytes(2, binaryData); pstmt.executeUpdate(); } pstmt.close(); Thread.sleep(10000); try (Statement stmt = conn.createStatement()) { try (ResultSet rs = stmt.executeQuery("SELECT id, val FROM CITY WHERE id < 100")) { while(rs.next()) { System.out.println(">>> Retrieved id " + rs.getLong(1)); } } } } catch (Exception e) { System.err.format("Unexpected failure: %s\n", e); e.printStackTrace(); } finally { if (conn != null) { System.out.print("Dropped database objects..."); try { executeSQL(conn, "DROP TABLE IF EXISTS CITY "); conn.close(); } catch (Exception ignore) { } } } } /** * Execute SQL command. * * @param conn Connection. * @param sql SQL statement. * @throws Exception If failed. */ private static void executeSQL(Connection conn, String sql) throws Exception { try (Statement stmt = conn.createStatement()) { stmt.executeUpdate(sql); } } } The following are from the Ignite logs: 2019-06-06 10:45:03,952 INFO Metrics for local node (to disable set 'metricsLogFrequency' to 0) ^-- Node [id=9f8714ae, name=cs_ittbix3, uptime=00:04:00.038] ^-- H/N/C [hosts=1, nodes=1, CPUs=8] ^-- CPU [cur=-100%, avg=-99.07%, GC=0%] ^-- PageMemory [pages=254721] ^-- Heap [used=179MB, free=82.5%, comm=1024MB] ^-- Off-heap [used=1006MB, free=57.13%, comm=1836MB] ^-- sysMemPlc region [used=0MB, free=99.99%, comm=100MB] ^-- default region [used=4MB, free=99.61%, comm=512MB] ^-- metastoreMemPlc region [used=0MB, free=99.94%, comm=100MB] ^-- storageWithPersistence region [used=1002MB, free=2.1%, comm=1024MB] ^-- TxLog region [used=0MB, free=100%, comm=100MB] ^-- Ignite persistence [used=11988MB] ^-- sysMemPlc region [used=0MB] ^-- metastoreMemPlc region [used=unknown] ^-- storageWithPersistence region [used=11988MB] ^-- TxLog region [used=0MB] ^-- Outbound messages queue [size=0] ^-- Public thread pool [active=0, idle=0, qSize=0] ^-- System thread pool [active=0, idle=6, qSize=0] ...... 2019-06-06 10:50:20,011 DEBUG Client request received [reqId=0, addr=/ 10.212.22.67:54554, req=JdbcQueryExecuteRequest [schemaName=FEATURE_TILE_CACHE, pageSize=1024, maxRows=0, sqlQry=SELECT id, val FROM CITY WHERE id > 500, args=[], stmtType=SELECT_STATEMENT_TYPE, autoCommit=true]] 2019-06-06 10:50:20,011 DEBUG Parsed query: `SELECT id, val FROM CITY WHERE id > 500` into two step query: GridCacheTwoStepQuery [mapQrys=[GridCacheSqlQuery [qry=SELECT __Z0.ID __C0_0, __Z0.VAL __C0_1 FROM FEATURE_TILE_CACHE.CITY __Z0 WHERE __Z0.ID > 500, paramIdxs=[], cols={__C0_0=GridSqlType [type=5, scale=0, precision=19, displaySize=20, sql=BIGINT], __C0_1=GridSqlType [type=12, scale=0, precision=2147483647, displaySize=2147483647, sql=VARBINARY]}, alias=null, sort=[], partitioned=true, node=null, derivedPartitions=null, hasSubQries=false]], rdc=GridCacheSqlQuery [qry=SELECT __C0_0 ID, __C0_1 VAL FROM PUBLIC.__T0, paramIdxs=[], cols=null, alias=null, sort=null, partitioned=false, node=null, derivedPartitions=null, hasSubQries=false], pageSize=1024, explain=false, originalSql=SELECT ID, VAL FROM FEATURE_TILE_CACHE.CITY WHERE ID > 500, distributedJoins=false, skipMergeTbl=true, local=false, mvccEnabled=false, forUpdate=false] 2019-06-06 10:50:20,014 ERROR Failed to execute SQL query [reqId=0, req=JdbcQueryExecuteRequest [schemaName=FEATURE_TILE_CACHE, pageSize=1024, maxRows=0, sqlQry=SELECT id, val FROM CITY WHERE id > 500, args=[], stmtType=SELECT_STATEMENT_TYPE, autoCommit=true]] org.apache.ignite.internal.processors.query.IgniteSQLException: Failed to set schema for DB connection for thread [schema=FEATURE_TILE_CACHE] at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.connectionForThread(IgniteH2Indexing.java:587) ~[ignite-indexing.jar:2.7.0] at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.connectionForSchema(IgniteH2Indexing.java:414) ~[ignite-indexing.jar:2.7.0] at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.query(GridReduceQueryExecutor.java:656) ~[ignite-indexing.jar:2.7.0] at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$8.iterator(IgniteH2Indexing.java:1803) ~[ignite-indexing.jar:2.7.0] at org.apache.ignite.internal.processors.cache.QueryCursorImpl.iterator(QueryCursorImpl.java:95) ~[ignite-core.jar:2.7.0] at org.apache.ignite.internal.processors.odbc.jdbc.JdbcQueryCursor.<init>(JdbcQueryCursor.java:61) ~[ignite-core.jar:2.7.0] at org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequestHandler.executeQuery(JdbcRequestHandler.java:528) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequestHandler.doHandle(JdbcRequestHandler.java:245) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequestHandler.handle(JdbcRequestHandler.java:208) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:162) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:45) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.util.nio.GridNioFilterChain$TailFilter.onMessageReceived(GridNioFilterChain.java:279) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.util.nio.GridNioFilterAdapter.proceedMessageReceived(GridNioFilterAdapter.java:109) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.util.nio.GridNioAsyncNotifyFilter$3.body(GridNioAsyncNotifyFilter.java:97) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120) [ignite-core.jar:2.7.0] at org.apache.ignite.internal.util.worker.GridWorkerPool$1.run(GridWorkerPool.java:70) [ignite-core.jar:2.7.0] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:?] at java.lang.Thread.run(Unknown Source) [?:?] Caused by: org.h2.jdbc.JdbcSQLException: Schema "FEATURE_TILE_CACHE" not found; SQL statement: SET SCHEMA "FEATURE_TILE_CACHE" [90079-197] at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) ~[h2.jar:1.4.197] at org.h2.message.DbException.get(DbException.java:179) ~[h2.jar:1.4.197] at org.h2.message.DbException.get(DbException.java:155) ~[h2.jar:1.4.197] at org.h2.engine.Database.getSchema(Database.java:1808) ~[h2.jar:1.4.197] at org.h2.command.dml.Set.update(Set.java:409) ~[h2.jar:1.4.197] at org.h2.command.CommandContainer.update(CommandContainer.java:102) ~[h2.jar:1.4.197] at org.h2.command.Command.executeUpdate(Command.java:261) ~[h2.jar:1.4.197] at org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:169) ~[h2.jar:1.4.197] at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:126) ~[h2.jar:1.4.197] at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.connectionForThread(IgniteH2Indexing.java:579) ~[ignite-indexing.jar:2.7.0] ... 18 more Is there anything I can do to avoid this? Thanks, Shane