[ https://issues.apache.org/jira/browse/IGNITE-17155?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexander Lapin updated IGNITE-17155: ------------------------------------- Ignite Flags: (was: Release Notes Required) > JDBC queries performance issue > ------------------------------ > > Key: IGNITE-17155 > URL: https://issues.apache.org/jira/browse/IGNITE-17155 > Project: Ignite > Issue Type: Task > Reporter: Alexander Lapin > Priority: Major > Labels: ignite-3 > > According to the latest benchmarks IGNITE_GET_METADATA_LOCALLY_ONLY doesn't > effect JDBC performance at all: > {code:java} > 3 node > without IGNITE_GET_METADATA_LOCALLY_ONLY: 15.1 req/sec > with IGNITE_GET_METADATA_LOCALLY_ONLY=true: 14.3 req/sec > 1 node > without IGNITE_GET_METADATA_LOCALLY_ONLY: 9.5 req/sec > with IGNITE_GET_METADATA_LOCALLY_ONLY=true: 10.6 req/sec{code} > Fist af all it's required to check how sql engine synchronizes table meta, > seems that it skips our common IGNITE_GET_METADATA_LOCALLY_ONLY aware > directProxy approach. > Benchmark itself: > {code:java} > class YCSBWorker extends Worker<YCSBBenchmark> { private final > ZipfianGenerator readRecord; > private static CounterGenerator insertRecord; > private final ZipfianGenerator randScan; private final char[] data = > new char[YCSBConstants.FIELD_SIZE]; > private final String[] params = new String[YCSBConstants.NUM_FIELDS]; > private final String[] results = new String[YCSBConstants.NUM_FIELDS]; > private final UpdateRecord procUpdateRecord; > private final ScanRecord procScanRecord; > private final ReadRecord procReadRecord; > private final ReadModifyWriteRecord procReadModifyWriteRecord; > private final InsertRecord procInsertRecord; > private final DeleteRecord procDeleteRecord; public > YCSBWorker(YCSBBenchmark benchmarkModule, int id, int init_record_count) { > super(benchmarkModule, id); > readRecord = new ZipfianGenerator(init_record_count);// pool for read > keys > randScan = new ZipfianGenerator(YCSBConstants.MAX_SCAN); > synchronized (YCSBWorker.class) { > // We must know where to start inserting > if (insertRecord == null) { > insertRecord = new CounterGenerator(init_record_count); > } > } // This is a minor speed-up to avoid having to invoke the > hashmap look-up > // everytime we want to execute a txn. This is important to do on > // a client machine with not a lot of cores > this.procUpdateRecord = this.getProcedure(UpdateRecord.class); > this.procScanRecord = this.getProcedure(ScanRecord.class); > this.procReadRecord = this.getProcedure(ReadRecord.class); > this.procReadModifyWriteRecord = > this.getProcedure(ReadModifyWriteRecord.class); > this.procInsertRecord = this.getProcedure(InsertRecord.class); > this.procDeleteRecord = this.getProcedure(DeleteRecord.class); > } @Override > protected TransactionStatus executeWork(Connection conn, TransactionType > nextTrans) throws UserAbortException, SQLException { > Class<? extends Procedure> procClass = nextTrans.getProcedureClass(); > if (procClass.equals(DeleteRecord.class)) { > deleteRecord(conn); > } else if (procClass.equals(InsertRecord.class)) { > insertRecord(conn); > } else if (procClass.equals(ReadModifyWriteRecord.class)) { > readModifyWriteRecord(conn); > } else if (procClass.equals(ReadRecord.class)) { > readRecord(conn); > } else if (procClass.equals(ScanRecord.class)) { > scanRecord(conn); > } else if (procClass.equals(UpdateRecord.class)) { > updateRecord(conn); > } > return (TransactionStatus.SUCCESS); > } private void updateRecord(Connection conn) throws SQLException { > int keyname = readRecord.nextInt(); > this.buildParameters(); > this.procUpdateRecord.run(conn, keyname, this.params); > } private void scanRecord(Connection conn) throws SQLException { > int keyname = readRecord.nextInt(); > int count = randScan.nextInt(); > this.procScanRecord.run(conn, keyname, count, new ArrayList<>()); > } private void readRecord(Connection conn) throws SQLException { > int keyname = readRecord.nextInt(); > this.procReadRecord.run(conn, keyname, this.results); > } private void readModifyWriteRecord(Connection conn) throws > SQLException { int keyname = readRecord.nextInt(); > this.buildParameters(); > this.procReadModifyWriteRecord.run(conn, keyname, this.params, > this.results); > } private void insertRecord(Connection conn) throws SQLException { > int keyname = insertRecord.nextInt(); > this.buildParameters(); > this.procInsertRecord.run(conn, keyname, this.params); > } private void deleteRecord(Connection conn) throws SQLException { > int keyname = readRecord.nextInt(); > this.procDeleteRecord.run(conn, keyname); > } private void buildParameters() { > Random rng = rng(); > for (int i = 0; i < this.params.length; i++) { > this.params[i] = new String(TextGenerator.randomFastChars(rng, > this.data)); > } > } > } {code} -- This message was sent by Atlassian Jira (v8.20.7#820007)