What the connections pools help?
Connection pool serves as a collection which contains several opening database connections that can be reused by database requests.
In fact, establishing a database connection is a time- consuming operation, and the process will include network link, user authentication and so on.
For ordinary process:
Using connection pool:
数据库连接池是为了提高代码的自动化程度。
自然界的池子里需要有水,数据库连接池里面有很多个连接并且这些连接可以被不同线程共用。
让数据库的打开和关闭都由数据库连接池自动管理。
数据库连接池在某种程度上是一个容器,每个连接的本质上是对象的复用。
一个比较典型的数据库连接池的示意图:
以上是Java语言编写的连接池。
当Java收到用户的请求时,会找到连接池中空闲的连接。
当发送关闭请求时,是连接池中占用状态的关闭,而不是连接的关闭,类似于挂机等待。
连接池有自己的策略,开多少个,占用多少个...
C3P0: 连接稳定,但是慢
Proxool: 快一些,但是有时候不是那么稳定
...
推荐:
Druid: 阿里推出的,主打监控
基于老师给的代码的一些测试:
测试一:创建数据库连接池并且测试连接语句
- 使用C3P0连接池结构https://www.mchange.com/projects/c3p0/index.html
- 用户:Java 数据库:Postgresql
- 设置一些连接池的参数: initialPoolSize , MaxPoolSize
测试二: 设置一些连接池的参数,并且讨论一些内在机制
- 内在代理机制: 仅仅是为了进行查看。
- 设置一些参数:
dataSource.setInitialPoolSize(1);
dataSource.setMaxPoolSize(1);
测试三: 获取连接池状态
public static void poolStatus(ComboPooledDataSource dataSource) {
try {
System.out.println("Busy Num " +
dataSource.getNumBusyConnections());
System.out.println("Idle Num" + dataSource.getNumIdleConnections());
System.out.println("All Num" + dataSource.getNumConnections());
} catch (SQLException e) {
e.printStackTrace();
}
}
测试四: 用连接池技术进行简单查询
// insert
String sql_insert = "......";
try {
PreparedStatement ps_insert = connection.prepareStatement(sql_insert);
ps_insert.executeLargeUpdate();
poolStatus(dataSource);
}catch (Exception e){
e.printStackTrace();
}