java.sql.PreparedStatement#setFetchSize ( )源码实例Demo

下面列出了java.sql.PreparedStatement#setFetchSize ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: gemfirexd-oss   文件: J2EEDataSourceTest.java
private PreparedStatement createFloatStatementForStateChecking(
    int[] parameterExpectedValues, int[] PreparedStatementExpectedValues,
    Connection conn, String sql) 
throws SQLException {
    PreparedStatement s = 
        internalCreateFloatStatementForStateChecking(conn, sql);
    s.setCursorName("StokeNewington");
    s.setFetchDirection(ResultSet.FETCH_REVERSE);
    s.setFetchSize(888);
    s.setMaxFieldSize(317);
    s.setMaxRows(91);

    // PreparedStatement Create        
    assertStatementState(
        parameterExpectedValues, PreparedStatementExpectedValues, s);
    return s;
}
 
源代码2 项目: tddl   文件: TGroupPreparedStatement.java
private PreparedStatement createPreparedStatementInternal(Connection conn, String sql) throws SQLException {
    PreparedStatement ps;
    if (autoGeneratedKeys != -1) {
        ps = conn.prepareStatement(sql, autoGeneratedKeys);
    } else if (columnIndexes != null) {
        ps = conn.prepareStatement(sql, columnIndexes);
    } else if (columnNames != null) {
        ps = conn.prepareStatement(sql, columnNames);
    } else {
        int resultSetHoldability = this.resultSetHoldability;
        if (resultSetHoldability == -1) // 未调用过setResultSetHoldability
        resultSetHoldability = conn.getHoldability();

        ps = conn.prepareStatement(sql, this.resultSetType, this.resultSetConcurrency, resultSetHoldability);
    }
    setBaseStatement(ps);
    ps.setQueryTimeout(queryTimeout); // 这句可能抛出异常,所以要放到setBaseStatement之后
    ps.setFetchSize(fetchSize);
    ps.setMaxRows(maxRows);
    fillSqlMetaData(ps, sql);
    return ps;
}
 
源代码3 项目: ambari-metrics   文件: PhoenixTransactSQL.java
private static PreparedStatement setQueryParameters(PreparedStatement stmt,
                                                    Condition condition) throws SQLException {
  int pos = 1;
  //For GET_LATEST_METRIC_SQL_SINGLE_HOST parameters should be set 2 times
  do {
    if (condition.getUuids() != null) {
      for (byte[] uuid : condition.getUuids()) {
        stmt.setBytes(pos++, uuid);
      }
    }
    if (condition.getFetchSize() != null) {
      stmt.setFetchSize(condition.getFetchSize());
      pos++;
    }
  } while (pos < stmt.getParameterMetaData().getParameterCount());

  return stmt;
}
 
源代码4 项目: dekaf   文件: MysqlIntermediateSession.java
@Override
protected void tuneStatementWithFetchSize(final PreparedStatement stmt,
                                          final int packLimit) throws SQLException {
  final boolean rowByRow;
  switch (getFetchStrategy()) {
    case MysqlConsts.FETCH_STRATEGY_ROW:
      rowByRow = true;
      break;
    case MysqlConsts.FETCH_STRATEGY_AUTO:
      rowByRow = packLimit > 0;
      break;
    case MysqlConsts.FETCH_STRATEGY_WHOLE:
    default:
      rowByRow = false;
      break;
  }

  if (rowByRow) {
    stmt.setFetchSize(Integer.MIN_VALUE);
  }
}
 
源代码5 项目: spliceengine   文件: J2EEDataSourceTest.java
private PreparedStatement createFloatStatementForStateChecking(
        int[] parameterExpectedValues, int[] PreparedStatementExpectedValues,
        Connection conn, String sql)
        throws SQLException {
    PreparedStatement s =
            internalCreateFloatStatementForStateChecking(conn, sql);
    s.setCursorName("StokeNewington");
    s.setFetchDirection(ResultSet.FETCH_REVERSE);
    s.setFetchSize(888);
    s.setMaxFieldSize(317);
    s.setMaxRows(91);

    // PreparedStatement Create        
    assertStatementState(
            parameterExpectedValues, PreparedStatementExpectedValues, s);
    return s;
}
 
@Override
public PreparedStatement buildSplitSql(Connection jdbcConnection, String catalogName, TableName tableName, Schema schema, Constraints constraints, Split split)
        throws SQLException
{
    PreparedStatement preparedStatement = jdbcSplitQueryBuilder.buildSql(jdbcConnection, null, tableName.getSchemaName(), tableName.getTableName(), schema, constraints, split);

    // Disable fetching all rows.
    preparedStatement.setFetchSize(Integer.MIN_VALUE);

    return preparedStatement;
}
 
源代码7 项目: myjdbc-rainbow   文件: DbHelper.java
public ResultSetData selectResultSet(String sqlOrID, Class<?> returnClass, Object[] params) throws Throwable {
	String doSql = JDBCUtils.getFinalSql(sqlOrID);
	SqlContext context = SqlCoreHandle.handleRequest(doSql, params).printSqlLog();
	Connection conn = ConnectionManager.getConnection(dataSource);
	PreparedStatement ps = conn.prepareStatement(context.getSql(),ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    if(conn.toString().equalsIgnoreCase("mysql")){
        ps.setFetchSize(Integer.MIN_VALUE);
    }
    ResultSet rs = JDBCUtils.setParamsReturnRS(ps, context.getParamList().toArray());
    return  new ResultSetData(returnClass,rs,ps);
}
 
@Override
public PublishedItem getLastPublishedItem(LeafNode node) {
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    PublishedItem item = null;

    try {
        con = DbConnectionManager.getConnection();
        // Get published items of the specified node
        pstmt = con.prepareStatement(LOAD_LAST_ITEM);
        pstmt.setFetchSize(1);
        pstmt.setMaxRows(1);
        pstmt.setString(1, node.getUniqueIdentifier().getServiceIdentifier().getServiceId());
        pstmt.setString(2, encodeNodeID(node.getNodeID()));
        rs = pstmt.executeQuery();
        // Rebuild loaded published items
        if (rs.next()) {
            String itemID = rs.getString(1);
            JID publisher = new JID(rs.getString(2));
            Date creationDate = new Date(Long.parseLong(rs.getString(3).trim()));
            // Create the item
            item = new PublishedItem(node, publisher, itemID, creationDate);
            // Add the extra fields to the published item
            if (rs.getString(4) != null) {
            	item.setPayloadXML(rs.getString(4));
            }
        }
    }
    catch (Exception sqle) {
        log.error(sqle.getMessage(), sqle);
    }
    finally {
        DbConnectionManager.closeConnection(rs, pstmt, con);
    }
    return item;
}
 
源代码9 项目: doma   文件: SelectCommand.java
protected void setupOptions(PreparedStatement preparedStatement) throws SQLException {
  if (query.getFetchSize() > 0) {
    preparedStatement.setFetchSize(query.getFetchSize());
  }
  if (query.getMaxRows() > 0) {
    preparedStatement.setMaxRows(query.getMaxRows());
  }
  if (query.getQueryTimeout() > 0) {
    preparedStatement.setQueryTimeout(query.getQueryTimeout());
  }
}
 
源代码10 项目: pentaho-kettle   文件: Database.java
void setMysqlFetchSize( PreparedStatement ps, int fs, int getMaxRows ) throws SQLException, KettleDatabaseException {
  if ( databaseMeta.isStreamingResults() && getDatabaseMetaData().getDriverMajorVersion() == 3 ) {
    ps.setFetchSize( Integer.MIN_VALUE );
  } else if ( fs <= getMaxRows ) {
    // PDI-11373 do not set fetch size more than max rows can returns
    ps.setFetchSize( fs );
  }
}
 
源代码11 项目: phoenix   文件: RoundRobinResultIteratorIT.java
@Test
public void testUnionAllSelects() throws Exception {
    int insertedRowsA = 10;
    int insertedRowsB = 5;
    int insertedRowsC = 7;
    String baseTableName = generateUniqueName();
    String tableA = "TABLEA" + baseTableName;
    String tableB = "TABLEB" + baseTableName;
    String tableC = "TABLEC" + baseTableName;
    Set<String> keySetA = createTableAndInsertRows(tableA, insertedRowsA, true, true);
    Set<String> keySetB = createTableAndInsertRows(tableB, insertedRowsB, true, true);
    Set<String> keySetC = createTableAndInsertRows(tableC, insertedRowsC, false, true);
    String query = "SELECT K FROM " + tableA + " UNION ALL SELECT K FROM " + tableB + " UNION ALL SELECT K FROM " + tableC;
    Connection conn = getConnection();
    PreparedStatement stmt = conn.prepareStatement(query);
    stmt.setFetchSize(2); // force parallel fetch of scanner cache
    ResultSet rs = stmt.executeQuery();
    int rowsA = 0, rowsB = 0, rowsC = 0;
    while (rs.next()) {
        String key = rs.getString(1);
        if (key.startsWith("TABLEA")) {
            rowsA++;
        } else if (key.startsWith("TABLEB")) {
            rowsB++;
        } else if (key.startsWith("TABLEC")) {
            rowsC++;
        }
        keySetA.remove(key);
        keySetB.remove(key);
        keySetC.remove(key);
    }
    assertEquals("Not all rows of tableA were returned", 0, keySetA.size());
    assertEquals("Not all rows of tableB were returned", 0, keySetB.size());
    assertEquals("Not all rows of tableC were returned", 0, keySetC.size());
    assertEquals("Number of rows retrieved didn't match for tableA", insertedRowsA, rowsA);
    assertEquals("Number of rows retrieved didnt match for tableB", insertedRowsB, rowsB);
    assertEquals("Number of rows retrieved didn't match for tableC", insertedRowsC, rowsC);
}
 
源代码12 项目: pentaho-kettle   文件: Database.java
public ResultSet openQuery( PreparedStatement ps, RowMetaInterface params, Object[] data )
  throws KettleDatabaseException {
  ResultSet res;

  // Create a Statement
  try {
    log.snap( Metrics.METRIC_DATABASE_OPEN_QUERY_START, databaseMeta.getName() );

    log.snap( Metrics.METRIC_DATABASE_SQL_VALUES_START, databaseMeta.getName() );
    setValues( params, data, ps ); // set the parameters!
    log.snap( Metrics.METRIC_DATABASE_SQL_VALUES_STOP, databaseMeta.getName() );

    if ( canWeSetFetchSize( ps ) ) {
      int maxRows = ps.getMaxRows();
      int fs = Const.FETCH_SIZE <= maxRows ? maxRows : Const.FETCH_SIZE;
      // mysql have some restriction on fetch size assignment
      if ( databaseMeta.isMySQLVariant() ) {
        setMysqlFetchSize( ps, fs, maxRows );
      } else {
        // other databases seems not.
        ps.setFetchSize( fs );
      }

      ps.setFetchDirection( ResultSet.FETCH_FORWARD );
    }

    if ( rowlimit > 0 && databaseMeta.supportsSetMaxRows() ) {
      ps.setMaxRows( rowlimit );
    }

    log.snap( Metrics.METRIC_DATABASE_EXECUTE_SQL_START, databaseMeta.getName() );
    res = ps.executeQuery();
    log.snap( Metrics.METRIC_DATABASE_EXECUTE_SQL_STOP, databaseMeta.getName() );

    // MySQL Hack only. It seems too much for the cursor type of operation on
    // MySQL, to have another cursor opened
    // to get the length of a String field. So, on MySQL, we ignore the length
    // of Strings in result rows.
    //
    log.snap( Metrics.METRIC_DATABASE_GET_ROW_META_START, databaseMeta.getName() );
    rowMeta = getRowInfo( res.getMetaData(), databaseMeta.isMySQLVariant(), false );
    log.snap( Metrics.METRIC_DATABASE_GET_ROW_META_STOP, databaseMeta.getName() );
  } catch ( SQLException ex ) {
    throw new KettleDatabaseException( "ERROR executing query", ex );
  } catch ( Exception e ) {
    throw new KettleDatabaseException( "ERROR executing query", e );
  } finally {
    log.snap( Metrics.METRIC_DATABASE_OPEN_QUERY_STOP, databaseMeta.getName() );
  }

  return res;
}
 
源代码13 项目: shardingsphere   文件: PostgreSQLJdbcDumper.java
@Override
protected PreparedStatement createPreparedStatement(final Connection conn, final String sql) throws SQLException {
    PreparedStatement result = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    result.setFetchSize(1);
    return result;
}
 
源代码14 项目: hop   文件: Database.java
public ResultSet openQuery( PreparedStatement ps, IRowMeta params, Object[] data )
  throws HopDatabaseException {
  ResultSet res;

  // Create a Statement
  try {
    log.snap( Metrics.METRIC_DATABASE_OPEN_QUERY_START, databaseMeta.getName() );

    log.snap( Metrics.METRIC_DATABASE_SQL_VALUES_START, databaseMeta.getName() );
    setValues( params, data, ps ); // set the parameters!
    log.snap( Metrics.METRIC_DATABASE_SQL_VALUES_STOP, databaseMeta.getName() );

    if ( canWeSetFetchSize( ps ) ) {
      int maxRows = ps.getMaxRows();
      int fs = Const.FETCH_SIZE <= maxRows ? maxRows : Const.FETCH_SIZE;
      // mysql have some restriction on fetch size assignment
      if ( databaseMeta.isMySqlVariant() ) {
        setMysqlFetchSize( ps, fs, maxRows );
      } else {
        // other databases seems not.
        ps.setFetchSize( fs );
      }

      ps.setFetchDirection( ResultSet.FETCH_FORWARD );
    }

    if ( rowlimit > 0 && databaseMeta.supportsSetMaxRows() ) {
      ps.setMaxRows( rowlimit );
    }

    log.snap( Metrics.METRIC_DATABASE_EXECUTE_SQL_START, databaseMeta.getName() );
    res = ps.executeQuery();
    log.snap( Metrics.METRIC_DATABASE_EXECUTE_SQL_STOP, databaseMeta.getName() );

    // MySQL Hack only. It seems too much for the cursor type of operation on
    // MySQL, to have another cursor opened
    // to get the length of a String field. So, on MySQL, we ignore the length
    // of Strings in result rows.
    //
    log.snap( Metrics.METRIC_DATABASE_GET_ROW_META_START, databaseMeta.getName() );
    rowMeta = getRowInfo( res.getMetaData(), databaseMeta.isMySqlVariant(), false );
    log.snap( Metrics.METRIC_DATABASE_GET_ROW_META_STOP, databaseMeta.getName() );
  } catch ( SQLException ex ) {
    throw new HopDatabaseException( "ERROR executing query", ex );
  } catch ( Exception e ) {
    throw new HopDatabaseException( "ERROR executing query", e );
  } finally {
    log.snap( Metrics.METRIC_DATABASE_OPEN_QUERY_STOP, databaseMeta.getName() );
  }

  return res;
}
 
源代码15 项目: r-course   文件: StatementsTest.java
public void testRowFetch() throws Exception {
    if (versionMeetsMinimum(5, 0, 5)) {
        createTable("testRowFetch", "(field1 int)");

        this.stmt.executeUpdate("INSERT INTO testRowFetch VALUES (1)");

        Connection fetchConn = null;

        Properties props = new Properties();
        props.setProperty("useCursorFetch", "true");

        try {
            fetchConn = getConnectionWithProps(props);

            PreparedStatement fetchStmt = fetchConn.prepareStatement("SELECT field1 FROM testRowFetch WHERE field1=1");
            fetchStmt.setFetchSize(10);
            this.rs = fetchStmt.executeQuery();
            assertTrue(this.rs.next());

            this.stmt.executeUpdate("INSERT INTO testRowFetch VALUES (2), (3)");

            fetchStmt = fetchConn.prepareStatement("SELECT field1 FROM testRowFetch ORDER BY field1");
            fetchStmt.setFetchSize(1);
            this.rs = fetchStmt.executeQuery();

            assertTrue(this.rs.next());
            assertEquals(1, this.rs.getInt(1));
            assertTrue(this.rs.next());
            assertEquals(2, this.rs.getInt(1));
            assertTrue(this.rs.next());
            assertEquals(3, this.rs.getInt(1));
            assertEquals(false, this.rs.next());

            this.rs = fetchStmt.executeQuery();
        } finally {
            if (fetchConn != null) {
                fetchConn.close();
            }
        }

    }
}
 
源代码16 项目: incubator-gobblin   文件: JdbcExtractor.java
/**
 * Execute query using JDBC PreparedStatement to pass query parameters Set
 * fetch size
 *
 * @param cmds commands - query, fetch size, query parameters
 * @return JDBC ResultSet
 * @throws Exception
 */
private CommandOutput<?, ?> executePreparedSql(List<Command> cmds) {
  String query = null;
  List<String> queryParameters = null;
  int fetchSize = 0;

  for (Command cmd : cmds) {
    if (cmd instanceof JdbcCommand) {
      JdbcCommandType type = (JdbcCommandType) cmd.getCommandType();
      switch (type) {
        case QUERY:
          query = cmd.getParams().get(0);
          break;
        case QUERYPARAMS:
          queryParameters = cmd.getParams();
          break;
        case FETCHSIZE:
          fetchSize = Integer.parseInt(cmd.getParams().get(0));
          break;
        default:
          this.log.error("Command " + type.toString() + " not recognized");
          break;
      }
    }
  }

  this.log.info("Executing query:" + query);
  ResultSet resultSet = null;
  try {
    this.jdbcSource = createJdbcSource();
    if (this.dataConnection == null) {
      this.dataConnection = this.jdbcSource.getConnection();
    }

    PreparedStatement statement =
        this.dataConnection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);

    int parameterPosition = 1;
    if (queryParameters != null && queryParameters.size() > 0) {
      for (String parameter : queryParameters) {
        statement.setString(parameterPosition, parameter);
        parameterPosition++;
      }
    }
    if (fetchSize != 0) {
      statement.setFetchSize(fetchSize);
    }
    final boolean status = statement.execute();
    if (status == false) {
      this.log.error("Failed to execute sql:" + query);
    }
    resultSet = statement.getResultSet();

  } catch (Exception e) {
    this.log.error("Failed to execute sql:" + query + " ;error-" + e.getMessage(), e);
  }

  CommandOutput<JdbcCommand, ResultSet> output = new JdbcCommandOutput();
  output.put((JdbcCommand) cmds.get(0), resultSet);
  return output;
}
 
源代码17 项目: mysql_perf_analyzer   文件: MetricsDbBase.java
public ResultList retrieveMetrics(String metricGroupName, Metric[] metrics, boolean hasKeyColumn, int dbid, long startDate, long endDate, boolean agg)
 {
String[] ms = new String[metrics.length];
for(int i=0; i<metrics.length; i++)ms[i] = metrics[i].getName();
if(!agg)return retrieveMetrics(metricGroupName, ms, hasKeyColumn, dbid,startDate,endDate);
int[] snaps = this.getSnapshostRange(startDate, endDate) ;
if(snaps == null)return null;//no data

if(metrics==null||metrics.length==0)//not specify the metrics? Get all
   	return retrieveMetrics( metricGroupName,  dbid,  startDate,  endDate);
   //later, connection pooling
ResultList rList = null;
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
StringBuilder sb = new StringBuilder();//build select list
StringBuilder grpBy = new StringBuilder();//build select list

sb.append("SNAP_ID");
sb.append(", TS");
for(Metric me: metrics)
{
	if(me.isIncremental())
		sb.append(", sum(");
	else
		sb.append(", avg(");
	sb.append(me.getName())
	  .append(") ")
	  .append (me.getName());
}

String sql = "select "+sb.toString()+" from "+metricGroupName+" where dbid=? and snap_id between ? and ? group by snap_id, ts order by snap_id";
//String sql = "select * from "+metricGroupName+" where dbid=?";
logger.log(Level.INFO, "To retrieve metrics "+metricGroupName+", metrics ("+sb.toString()+") for db "+dbid+" with time range ("+startDate+", "+endDate+"), snap ("+snaps[0]+", "+snaps[1]+")");
try
{
  conn = createConnection(true);
  stmt = conn.prepareStatement(sql);
  stmt.setFetchSize(1000);
  //stmt.setMaxRows(5000);
  stmt.setInt(1, dbid);
  stmt.setInt(2, snaps[0]);
  stmt.setInt(3,  snaps[1]);
  rs = stmt.executeQuery();
  rList = ResultListUtil.fromSqlResultSet(rs, 5000);
}catch(Exception ex)
{
	logger.log(Level.SEVERE, "Failed to retrieve metrics "+metricGroupName+" for db "+dbid+" with time range ("+startDate+", "+endDate+")", ex);
}finally
{
     DBUtils.close(stmt);	
  DBUtils.close(conn);	
}
return rList;
 }
 
源代码18 项目: mysql_perf_analyzer   文件: MetricsDbBase.java
/** 
  * Retrieve user defined merics
  * @param metrics
  * @param dbid
  * @param startDate
  * @param endDate
  * @return
  */
 public ResultList retrieveUDMMetrics(String metric, int dbid, long startDate, long endDate)
 {		  
int[] snaps = this.getSnapshostRange(startDate, endDate) ;
if(snaps == null)return null;//no data

//later, connection pooling
ResultList rList = null;
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;

int code = 0;
if(this.metricCodeMap.containsKey(metric))
{
	code =	this.metricCodeMap.get(metric);
}else
{
	logger.warning("Failed to find metrics code for "+metric+", "+this.metricCodeMap);
	return null;
}

String sql = "select SNAP_ID, TS, METRIC_ID, VALUE from METRIC_GENERIC where dbid=? and snap_id between ? and ? and METRIC_ID=? order by dbid, METRIC_ID, snap_id";
//String sql = "select * from "+metricGroupName+" where dbid=?";
logger.log(Level.INFO, "To retrieve "+metric+", "+ code+" on db "+dbid+" with time range ("+startDate+", "+endDate+"), using "+sql);
try
{
  conn = createConnection(true);
  stmt = conn.prepareStatement(sql);
  stmt.setFetchSize(1000);
  //stmt.setMaxRows(5000);
  stmt.setInt(1, dbid);
  stmt.setInt(2, snaps[0]);
  stmt.setInt(3,  snaps[1]);
  stmt.setLong(4,  code);
  rs = stmt.executeQuery();
  if(rs==null)return rList;
  rList = new ResultList();
  //java.sql.ResultSetMetaData meta =  rs.getMetaData();
  ColumnDescriptor desc = new ColumnDescriptor();
  desc.addColumn("SNAP_ID", true, 1);
  desc.addColumn("TS", true, 2);
  desc.addColumn(metric, true, 3);
  
  rList.setColumnDescriptor(desc);
  int rowCnt = 0;
  //List<ColumnInfo> cols = desc.getColumns();
  while(rs.next())
  {
		//logger.info(new java.util.Date()+": process "+rowCnt+" rows");
		ResultRow row = new ResultRow();
		row.setColumnDescriptor(desc);
		java.util.ArrayList<String> cols2 = new java.util.ArrayList<String>(3);
		cols2.add(rs.getString(1));
		cols2.add(rs.getString(2));
		cols2.add(rs.getString(4));
		row.setColumns(cols2);
		rList.addRow(row);
		rowCnt++;
		if(rowCnt>=5000)break;
	}
	logger.info(new java.util.Date()+": Process results done: "+rList.getRows().size());
}catch(Exception ex)
{
	logger.log(Level.SEVERE, "Failed to retrieve UDM "+metric+" for db "+dbid+" with time range ("+startDate+", "+endDate+")", ex);
}finally
{
     DBUtils.close(stmt);	
  DBUtils.close(conn);	
}
return rList;
 }
 
源代码19 项目: lams   文件: StatementPreparerImpl.java
private void setStatementFetchSize(PreparedStatement statement) throws SQLException {
	if ( settings().getJdbcFetchSize() != null ) {
		statement.setFetchSize( settings().getJdbcFetchSize() );
	}
}
 
源代码20 项目: lams   文件: Loader.java
/**
 * Obtain a <tt>PreparedStatement</tt> with all parameters pre-bound.
 * Bind JDBC-style <tt>?</tt> parameters, named parameters, and
 * limit parameters.
 */
protected final PreparedStatement prepareQueryStatement(
		String sql,
		final QueryParameters queryParameters,
		final LimitHandler limitHandler,
		final boolean scroll,
		final SharedSessionContractImplementor session) throws SQLException, HibernateException {
	final Dialect dialect = getFactory().getDialect();
	final RowSelection selection = queryParameters.getRowSelection();
	final boolean useLimit = LimitHelper.useLimit( limitHandler, selection );
	final boolean hasFirstRow = LimitHelper.hasFirstRow( selection );
	final boolean useLimitOffset = hasFirstRow && useLimit && limitHandler.supportsLimitOffset();
	final boolean callable = queryParameters.isCallable();
	final ScrollMode scrollMode = getScrollMode( scroll, hasFirstRow, useLimitOffset, queryParameters );

	PreparedStatement st = session.getJdbcCoordinator().getStatementPreparer().prepareQueryStatement(
			sql,
			callable,
			scrollMode
	);

	try {

		int col = 1;
		//TODO: can we limit stored procedures ?!
		col += limitHandler.bindLimitParametersAtStartOfQuery( selection, st, col );

		if ( callable ) {
			col = dialect.registerResultSetOutParameter( (CallableStatement) st, col );
		}

		col += bindParameterValues( st, queryParameters, col, session );

		col += limitHandler.bindLimitParametersAtEndOfQuery( selection, st, col );

		limitHandler.setMaxRows( selection, st );

		if ( selection != null ) {
			if ( selection.getTimeout() != null ) {
				st.setQueryTimeout( selection.getTimeout() );
			}
			if ( selection.getFetchSize() != null ) {
				st.setFetchSize( selection.getFetchSize() );
			}
		}

		// handle lock timeout...
		LockOptions lockOptions = queryParameters.getLockOptions();
		if ( lockOptions != null ) {
			if ( lockOptions.getTimeOut() != LockOptions.WAIT_FOREVER ) {
				if ( !dialect.supportsLockTimeouts() ) {
					if ( LOG.isDebugEnabled() ) {
						LOG.debugf(
								"Lock timeout [%s] requested but dialect reported to not support lock timeouts",
								lockOptions.getTimeOut()
						);
					}
				}
				else if ( dialect.isLockTimeoutParameterized() ) {
					st.setInt( col++, lockOptions.getTimeOut() );
				}
			}
		}

		if ( LOG.isTraceEnabled() ) {
			LOG.tracev( "Bound [{0}] parameters total", col );
		}
	}
	catch (SQLException | HibernateException e) {
		session.getJdbcCoordinator().getLogicalConnection().getResourceRegistry().release( st );
		session.getJdbcCoordinator().afterStatementExecution();
		throw e;
	}

	return st;
}