/** * Test class: Verify object pool manager functionality * @author chuyang * @version 1.0 */ public class ConnectionPoolTest { public ConnectionPoolManager m_ConnectionPoolManager; public ConnectionPoolTest(){ } @Override public void finalize() throws Throwable { } /** * Main test method * @param args */ public static void main(String[] args) { System.out.println("=== Start Object Pool Manager Test ==="); // 1. Test initializing connection pool System.out.println("\n1. Initialize connection pool"); ConnectionPoolManager poolManager = new ConnectionPoolManager(2, 5, "jdbc:mysql://localhost:3306/testdb"); System.out.println(poolManager.getPoolStatus()); // 2. Test borrowing connections System.out.println("\n2. Test borrowing connections"); DatabaseConnection conn1 = poolManager.borrowConnection(); DatabaseConnection conn2 = poolManager.borrowConnection(); DatabaseConnection conn3 = poolManager.borrowConnection(); // Should create new connection System.out.println(poolManager.getPoolStatus()); // 3. Test returning connections System.out.println("\n3. Test returning connections"); poolManager.returnConnection(conn1); System.out.println(poolManager.getPoolStatus()); // 4. Test reusing connections System.out.println("\n4. Test reusing connections"); DatabaseConnection conn4 = poolManager.borrowConnection(); // Should reuse just returned connection System.out.println("Reused connection ID: " + conn4.getConnectionId()); System.out.println(poolManager.getPoolStatus()); // 5. Test pool full condition System.out.println("\n5. Test pool full condition"); DatabaseConnection conn5 = poolManager.borrowConnection(); // Create 4th connection DatabaseConnection conn6 = poolManager.borrowConnection(); // Create 5th connection (reach max capacity) DatabaseConnection conn7 = poolManager.borrowConnection(); // Should return null as pool is full System.out.println("Result of borrowing beyond max capacity: " + (conn7 == null ? "Pool is full, cannot borrow more connections" : "Successfully borrowed connection")); System.out.println(poolManager.getPoolStatus()); // 6. Test shrinking pool System.out.println("\n6. Test shrinking pool"); // Return some connections for shrinking poolManager.returnConnection(conn2); poolManager.returnConnection(conn3); poolManager.returnConnection(conn5); poolManager.returnConnection(conn6); System.out.println("Before shrink " + poolManager.getPoolStatus()); poolManager.shrinkPool(); System.out.println("After shrink " + poolManager.getPoolStatus()); // 7. Test thread safety (simple test) System.out.println("\n7. Simple thread safety test"); ConnectionPoolManager threadTestPool = new ConnectionPoolManager(3, 10, "jdbc:mysql://localhost:3306/testdb"); // Create several threads to borrow and return connections simultaneously Thread[] threads = new Thread[5]; for (int i = 0; i < threads.length; i++) { final int threadId = i; threads[i] = new Thread(() -> { try { System.out.println("Thread " + threadId + " borrowing connection"); DatabaseConnection conn = threadTestPool.borrowConnection(); if (conn != null) { System.out.println("Thread " + threadId + " got connection: " + conn.getConnectionId()); // Simulate using connection Thread.sleep(200); threadTestPool.returnConnection(conn); System.out.println("Thread " + threadId + " returned connection: " + conn.getConnectionId()); } } catch (Exception e) { e.printStackTrace(); } }); threads[i].start(); } // Wait for all threads to complete for (Thread thread : threads) { try { thread.join(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } System.out.println("\nAfter thread test " + threadTestPool.getPoolStatus()); // 8. Test DatabaseConnection clone functionality System.out.println("\n8. Test connection clone functionality"); DatabaseConnection originalConn = new DatabaseConnection("original-clone-test", "jdbc:mysql://localhost:3306/clonedb"); DatabaseConnection clonedConn = originalConn.clone(); System.out.println("Original connection ID: " + originalConn.getConnectionId()); System.out.println("Cloned connection ID: " + clonedConn.getConnectionId()); System.out.println("Cloned connection URL: " + clonedConn.getDatabaseUrl()); System.out.println("\n=== Object Pool Manager Test Completed ==="); } }