? build.local.properties ? log ? no-deadlock-on-many-queries.patch ? p ? org/postgresql/core/v3/.QueryExecutorImpl.java.swp Index: org/postgresql/core/v3/QueryExecutorImpl.java =================================================================== RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/core/v3/QueryExecutorImpl.java,v retrieving revision 1.41 diff -c -r1.41 QueryExecutorImpl.java *** org/postgresql/core/v3/QueryExecutorImpl.java 30 Sep 2008 23:41:23 -0000 1.41 --- org/postgresql/core/v3/QueryExecutorImpl.java 16 Oct 2008 20:06:02 -0000 *************** *** 187,193 **** try { handler = sendQueryPreamble(handler, flags); ! sendQuery((V3Query)query, (V3ParameterList)parameters, maxRows, fetchSize, flags); sendSync(); processResults(handler, flags); } --- 187,195 ---- try { handler = sendQueryPreamble(handler, flags); ! ErrorTrackingResultHandler trackingHandler = new ErrorTrackingResultHandler(handler); ! queryCount = 0; ! sendQuery((V3Query)query, (V3ParameterList)parameters, maxRows, fetchSize, flags, trackingHandler); sendSync(); processResults(handler, flags); } *************** *** 318,348 **** try { - int queryCount = 0; - handler = sendQueryPreamble(handler, flags); ErrorTrackingResultHandler trackingHandler = new ErrorTrackingResultHandler(handler); for (int i = 0; i < queries.length; ++i) { - ++queryCount; - if (queryCount >= MAX_BUFFERED_QUERIES) - { - sendSync(); - processResults(trackingHandler, flags); - - // If we saw errors, don't send anything more. - if (trackingHandler.hasErrors()) - break; - - queryCount = 0; - } - V3Query query = (V3Query)queries[i]; V3ParameterList parameters = (V3ParameterList)parameterLists[i]; if (parameters == null) parameters = SimpleQuery.NO_PARAMETERS; ! sendQuery(query, parameters, maxRows, fetchSize, flags); } if (!trackingHandler.hasErrors()) --- 320,340 ---- try { handler = sendQueryPreamble(handler, flags); ErrorTrackingResultHandler trackingHandler = new ErrorTrackingResultHandler(handler); + queryCount = 0; for (int i = 0; i < queries.length; ++i) { V3Query query = (V3Query)queries[i]; V3ParameterList parameters = (V3ParameterList)parameterLists[i]; if (parameters == null) parameters = SimpleQuery.NO_PARAMETERS; ! ! sendQuery(query, parameters, maxRows, fetchSize, flags, trackingHandler); ! ! if (trackingHandler.hasErrors()) ! break; } if (!trackingHandler.hasErrors()) *************** *** 634,652 **** /* * Send a query to the backend. */ ! private void sendQuery(V3Query query, V3ParameterList parameters, int maxRows, int fetchSize, int flags) throws IOException, SQLException { // Now the query itself. SimpleQuery[] subqueries = query.getSubqueries(); SimpleParameterList[] subparams = parameters.getSubparams(); if (subqueries == null) { ! sendOneQuery((SimpleQuery)query, (SimpleParameterList)parameters, maxRows, fetchSize, flags); } else { for (int i = 0; i < subqueries.length; ++i) { // In the situation where parameters is already // NO_PARAMETERS it cannot know the correct // number of array elements to return in the --- 626,668 ---- /* * Send a query to the backend. */ ! private void sendQuery(V3Query query, V3ParameterList parameters, int maxRows, int fetchSize, int flags, ErrorTrackingResultHandler trackingHandler) throws IOException, SQLException { // Now the query itself. SimpleQuery[] subqueries = query.getSubqueries(); SimpleParameterList[] subparams = parameters.getSubparams(); if (subqueries == null) { ! ++queryCount; ! if (queryCount >= MAX_BUFFERED_QUERIES) ! { ! sendSync(); ! processResults(trackingHandler, flags); ! ! queryCount = 0; ! } ! ! // If we saw errors, don't send anything more. ! if (!trackingHandler.hasErrors()) ! sendOneQuery((SimpleQuery)query, (SimpleParameterList)parameters, maxRows, fetchSize, flags); } else { for (int i = 0; i < subqueries.length; ++i) { + ++queryCount; + if (queryCount >= MAX_BUFFERED_QUERIES) + { + sendSync(); + processResults(trackingHandler, flags); + + // If we saw errors, don't send anything more. + if (trackingHandler.hasErrors()) + break; + + queryCount = 0; + } + // In the situation where parameters is already // NO_PARAMETERS it cannot know the correct // number of array elements to return in the *************** *** 1675,1680 **** --- 1691,1700 ---- private final Logger logger; private final boolean allowEncodingChanges; + // The number of queries executed so far. Used to avoid deadlocks. + // See MAX_BUFFERED_QUERIES. + private int queryCount; + private final SimpleQuery beginTransactionQuery = new SimpleQuery(new String[] { "BEGIN" }, null); private final static SimpleQuery EMPTY_QUERY = new SimpleQuery(new String[] { "" }, null);