/** * Copyright 2010 Wallace Wadge * * Licensed 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 com.jolbox.bonecp.reportedIssues; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import com.jolbox.bonecp.BoneCPDataSource; public class TimeoutFailure { private static Throwable closeException = null; public static void main(String[] args) throws ClassNotFoundException, InterruptedException, SQLException, IOException { // System.setProperty("oracle.jdbc.ReadTimeout", "5000"); Class.forName("org.postgresql.Driver"); BoneCPDataSource ds = new BoneCPDataSource(); ds.setJdbcUrl("jdbc:postgresql://localhost/postgres"); ds.setUsername("postgres"); ds.setPassword("postgres"); ds.setDefaultAutoCommit(false); ds.sanitize(); System.out.println("Initial connection test"); testConnection(ds); System.out.println("Unplug your network cable "); System.in.read(); System.out.println("Doing test, will have pgsql timeout after 5 seconds"); testConnection(ds); System.out.println("Plug your network cable"); System.in.read(); // Thread.sleep(10000); System.out.println("Doing test"); testConnection(ds); } private static void testConnection(BoneCPDataSource ds) throws SQLException { closeException = null; Connection connection = null; boolean timedOut = true; try { connection = ds.getConnection(); System.out.println(" Got connection"); connection.getMetaData(); int leased = ds.getTotalLeased(); System.out.println(" Leased (should be 1) = " + leased); Statement stmt = connection.createStatement(); System.out.println(" Executing statement"); stmt.execute("select NOW()"); timedOut = false; } catch (Throwable t) { System.err.println("Exception: " + t.getMessage()); } finally { if (timedOut) { System.out.println(" Timed out"); } silentClose(connection); System.out.println(" Released connection"); int leased = ds.getTotalLeased(); System.out.println(" Leased (should be 0) = " + leased); if (leased != 0) { System.out.println("Failed, there should be no leased connections."); if (closeException != null) { System.err.println("An exception was thrown on close: " + closeException.getMessage()); } } } } private static void silentClose(Connection connection) { try { if (connection != null) connection.close(); Thread.sleep(100); } catch (Throwable t) { closeException = t; } } }