public static Connection getConnection() { Iterator<ConnectionWrapper> poolIter = connectionPool.iterator(); while (poolIter.hasNext()) { ConnectionWrapper conn = poolIter.next(); try { if (conn == null || conn.isReallyClosed()) { poolIter.remove(); } else if (!conn.isClosed()) { return conn; } } catch (SQLException e) { log.error("Bad connection", e); poolIter.remove(); } } // No valid connections ConnectionWrapper conn = createConnection(); if (conn != null) { connectionPool.add(conn); log.info("Connection pool size: " + connectionPool.size()); } return conn; }
private static void clearClosedConnection() { long time = System.currentTimeMillis(); // sometimes user change system time,just return if (time < m_lastClearClosedConnection) { m_lastClearClosedConnection = time; return; } // no need check very often if (time - m_lastClearClosedConnection < CHECK_CLOSED_CONNECTION_TIME) { return; } m_lastClearClosedConnection = time; // begin check Iterator iterator = m_notUsedConnection.iterator(); while (iterator.hasNext()) { ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next(); try { if (wrapper.connection.isClosed()) { iterator.remove(); } } catch (Exception e) { iterator.remove(); if (DEBUG) { System.out.println("connection is closed, this connection initial StackTrace"); wrapper.debugInfo.printStackTrace(); } } } // make connection pool size smaller if too big int decrease = getDecreasingConnectionCount(); if (m_notUsedConnection.size() < decrease) { return; } while (decrease-- > 0) { ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst(); try { wrapper.connection.close(); } catch (Exception e) { } } }
/** * Removes all ConnectionInfos from tracking where for the key & passed in Connection * * @param key the connection key * @param con the connection to remove */ private static synchronized void remove(String key, Connection con) { final Collection<ConnectionInfo> conInfos = getConnectionInfos(key); for (Iterator<ConnectionInfo> i = conInfos.iterator(); i.hasNext(); ) { final ConnectionInfo conInfo = i.next(); if (conInfo.getConnection() == con) { i.remove(); } } OPEN_CONNECTIONS.get().put(key, conInfos); }
boolean closeAndRemoveResultSets(Set rsSet) { boolean okay = true; synchronized (rsSet) { for (Iterator ii = rsSet.iterator(); ii.hasNext(); ) { ResultSet rs = (ResultSet) ii.next(); try { rs.close(); } catch (SQLException e) { if (Debug.DEBUG) logger.log(MLevel.WARNING, "An exception occurred while cleaning up a ResultSet.", e); // e.printStackTrace(); okay = false; } finally { ii.remove(); } } } return okay; }
public static void main(String[] argv) { try { ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setJdbcUrl(argv[0]); cpds.setUser(argv[1]); cpds.setPassword(argv[2]); cpds.setMinPoolSize(5); cpds.setAcquireIncrement(5); cpds.setMaxPoolSize(20); System.err.println("Initial..."); display(cpds); Thread.sleep(2000); HashSet hs = new HashSet(); for (int i = 0; i < 20; ++i) { Connection c = cpds.getConnection(); hs.add(c); System.err.println("Adding (" + (i + 1) + ") " + c); display(cpds); Thread.sleep(1000); // if (i == 9) // { // //System.err.println("hardReset()ing"); // //cpds.hardReset(); // System.err.println("softReset()ing"); // cpds.softReset(); // } } int count = 0; for (Iterator ii = hs.iterator(); ii.hasNext(); ) { Connection c = ((Connection) ii.next()); System.err.println("Removing " + ++count); ii.remove(); try { c.getMetaData().getTables(null, null, "PROBABLYNOT", new String[] {"TABLE"}); } catch (Exception e) { System.err.println(e); System.err.println(); continue; } finally { c.close(); } Thread.sleep(2000); display(cpds); } System.err.println( "Closing data source, \"forcing\" garbage collection, and sleeping for 5 seconds..."); cpds.close(); System.gc(); System.err.println("Main Thread: Sleeping for five seconds!"); Thread.sleep(5000); // System.gc(); // Thread.sleep(5000); System.err.println("Bye!"); } catch (Exception e) { e.printStackTrace(); } }