简要说明
任务
用超时等待模式构造一个简单的数据库连接池,模拟从连接池中获取、使用、释放连接的过程。
手段
- 将客户端获取连接的过程设定为超时等待的模式,即在1000ms内如果无法获取到可用连接,将返回null给客户端;
- 设定连接池的大小为10,通过调节客户端连接的线程数模拟无法获取连接的场景;
代码实现
ConnectionPool
1 | import java.sql.Connection; |
ConnectionDriver
1 | import java.lang.reflect.InvocationHandler; |
ConnectionPoolTest
1 | import java.sql.Connection; |
测试
一次运行结果展示:
1 | 总获取次数:200 |
当前代码实现的是10个线程同时运行获取连接池(10个连接不变)的情况,现可通过设定不同线程数量来观察获取连接的情况。具体线程数量和总获取次数的设定情况,以及测试结果得到的获取到的次数、未获取到的次数和未获取到的比例均参见下表:
说明:本机测试环境CPU:i5-3210M,内存:8G,不同环境可能测试结果会有偏差
线程数量与连接获取的关系
| 线程数量 | 总获取次数 | 获取到次数 | 未获取到次数 | 未获取到比例 |
|---|---|---|---|---|
| 10 | 200 | 200 | 0 | 0.00% |
| 20 | 400 | 388 | 12 | 3.00% |
| 30 | 600 | 556 | 44 | 7.30% |
| 40 | 800 | 694 | 106 | 13.25% |
| 50 | 1000 | 820 | 180 | 18.00% |
分析:
从上表可以看出随着获取连接线程的逐步增多,在保持线程池内10个连接的情况下,未获取到连接次数的比例也从0%到7.3%再到18%逐步增多。