<classpathentry kind="var" path="TOMCAT_LIBS_BASE/tomcat7-deps/dbcp/tomcat-dbcp.jar" sourcepath="/TOMCAT_LIBS_BASE/tomcat6-deps/dbcp/src/java"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/tomcat-7.0.x"/>
+ <classpathentry kind="lib" path="includes/h2/bin/h2-1.2.129.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
* @throws SQLException
*/
public Future<Connection> getConnectionAsync() throws SQLException {
+ PooledConnection pc = this.borrowConnection(0, null, null);
+ if (pc!=null) {
+ return new ConnectionFuture(pc);
+ }
//we can only retrieve a future if the underlying queue supports it.
if (idle instanceof FairBlockingQueue<?>) {
Future<PooledConnection> pcf = ((FairBlockingQueue<PooledConnection>)idle).pollAsync();
Connection result = null;
SQLException cause = null;
AtomicBoolean cancelled = new AtomicBoolean(false);
+ volatile PooledConnection pc = null;
public ConnectionFuture(Future<PooledConnection> pcf) {
this.pcFuture = pcf;
}
+ public ConnectionFuture(PooledConnection pc) {
+ this.pc = pc;
+ }
/**
* {@inheritDoc}
*/
public boolean cancel(boolean mayInterruptIfRunning) {
- if ((!cancelled.get()) && cancelled.compareAndSet(false, true)) {
+ if (pc!=null) {
+ return false;
+ } else if ((!cancelled.get()) && cancelled.compareAndSet(false, true)) {
//cancel by retrieving the connection and returning it to the pool
ConnectionPool.this.cancellator.execute(this);
}
* {@inheritDoc}
*/
public Connection get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
- PooledConnection pc = pcFuture.get(timeout,unit);
+ PooledConnection pc = this.pc!=null?this.pc:pcFuture.get(timeout,unit);
if (pc!=null) {
if (result!=null) return result;
if (configured.compareAndSet(false, true)) {
* {@inheritDoc}
*/
public boolean isCancelled() {
- return pcFuture.isCancelled() || cancelled.get();
+ return pc==null && (pcFuture.isCancelled() || cancelled.get());
}
/**
* {@inheritDoc}
*/
public boolean isDone() {
- return pcFuture.isDone();
+ return pc!=null || pcFuture.isDone();
}
/**
--- /dev/null
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.jdbc.test;
+
+import java.sql.Connection;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.tomcat.jdbc.pool.DataSourceProxy;
+
+/**
+ * @author Filip Hanik
+ * @version 1.0
+ */
+public class Async0IdleTestBug50477 extends DefaultTestCase {
+ public Async0IdleTestBug50477(String name) {
+ super(name);
+ }
+
+
+ public void testAsync0Idle0Size() throws Exception {
+ System.out.println("[testPoolThreads20Connections10FairAsync] Starting fairness - Tomcat JDBC - Fair - Async");
+ init();
+ this.datasource.getPoolProperties().setMaxActive(10);
+ this.datasource.getPoolProperties().setFairQueue(true);
+ this.datasource.getPoolProperties().setInitialSize(0);
+ try {
+ Future<Connection> cf = ((DataSourceProxy)datasource).getConnectionAsync();
+ Connection con = cf.get(5, TimeUnit.SECONDS);
+ }finally {
+ tearDown();
+ }
+ }
+}
+