@Override protected BatchSelect newBatchSelect(PreparedQuery preparedQuery, List<ColumnGetter> getters, int fetchRows, int queryTimeout) throws SQLException { String query = preparedQuery.getQuery(); List<JdbcLiteral> params = preparedQuery.getParameters(); logger.info("SQL: " + query); PreparedStatement stmt = connection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); // TYPE_FORWARD_ONLY and CONCUR_READ_ONLY are default if (!params.isEmpty()) { logger.info("Parameters: {}", params); prepareParameters(stmt, getters, params); } if (fetchRows == 1) { // See MySQLInputPlugin.newConnection doesn't set useCursorFetch=true when fetchRows=1 // MySQL Connector/J keeps the connection opened and process rows one by one with Integer.MIN_VALUE. stmt.setFetchSize(Integer.MIN_VALUE); } else if (fetchRows <= 0) { // uses the default behavior. MySQL Connector/J fetches the all rows in memory. } else { // useCursorFetch=true is enabled. MySQL creates temporary table and uses multiple select statements to fetch rows. stmt.setFetchSize(fetchRows); } // Because socketTimeout is set in Connection, don't need to set quertyTimeout. return new SingleSelect(stmt); }
newOrderByExpression); return new PreparedQuery(newQuery, parameters);
preparedQuery = new PreparedQuery(rawQuery, ImmutableList.<JdbcLiteral>of());
@Override protected BatchSelect newBatchSelect(PreparedQuery preparedQuery, List<ColumnGetter> getters, int fetchRows, int queryTimeout) throws SQLException { String query = "DECLARE cur NO SCROLL CURSOR FOR " + preparedQuery.getQuery(); List<JdbcLiteral> params = preparedQuery.getParameters(); logger.info("SQL: " + query); PreparedStatement stmt = connection.prepareStatement(query); try { if (!params.isEmpty()) { logger.info("Parameters: {}", params); prepareParameters(stmt, getters, params); } stmt.executeUpdate(); } finally { stmt.close(); } String fetchSql = "FETCH FORWARD "+fetchRows+" FROM cur"; // Because socketTimeout is set in Connection, don't need to set quertyTimeout. return new CursorSelect(fetchSql, connection.prepareStatement(fetchSql)); }
public PreparedQuery wrapIncrementalQuery(String rawQuery, JdbcSchema querySchema, List<String> incrementalColumns, List<JsonNode> incrementalValues, boolean useRawQuery) throws SQLException { StringBuilder sb = new StringBuilder(); List<JdbcLiteral> parameters = ImmutableList.of(); if (useRawQuery) { parameters = replacePlaceholder(sb, rawQuery, querySchema, incrementalColumns, incrementalValues); } else { sb.append("SELECT * FROM ("); sb.append(truncateStatementDelimiter(rawQuery)); sb.append(") embulk_incremental_"); if (incrementalValues != null) { sb.append(" WHERE "); parameters = buildIncrementalConditionTo(sb, querySchema, incrementalColumns, incrementalValues); } sb.append(" ORDER BY "); buildIncrementalOrderTo(sb, querySchema, incrementalColumns); } return new PreparedQuery(sb.toString(), parameters); }
protected BatchSelect newBatchSelect(PreparedQuery preparedQuery, List<ColumnGetter> getters, int fetchRows, int queryTimeout) throws SQLException { String query = preparedQuery.getQuery(); List<JdbcLiteral> params = preparedQuery.getParameters(); PreparedStatement stmt = connection.prepareStatement(query); stmt.setFetchSize(fetchRows); stmt.setQueryTimeout(queryTimeout); logger.info("SQL: " + query); if (!params.isEmpty()) { logger.info("Parameters: {}", params); prepareParameters(stmt, getters, params); } return new SingleSelect(stmt); }