PreparedStatement接口中的方法 | 说明 |
---|---|
ParameterMetaData getParameterMetaData() | 通过预编译语句获取 |
ParameterMetaData接口中的方法 | 说明 |
---|---|
int getParameterCount() | 获取参数的个数 |
String getParameterTypeName(int param) | 获取指定列的参数类型 |
ResultSet接口中的方法 | 说明 |
---|---|
ResultSetMetaData getMetaData() | 通过结果集获取 |
ResultSetMetaData接口中的方法 | 说明 |
---|---|
int getColumnCount() | 获取列数 |
String getColumnName(int column) | 获取指定列的名字 |
String getColumnTypeName(int column) | 获取指定列的 |
JDBC访问数据库的每个增删改查的操作都需要先创建连接,而且这个连接对象是不能共享的。每个用户每次访问都必须创建一个连接对象,并且这个连接对象应该设置成局部变量。
使用连接池的目的就是为了解决以上2个问题
没有使用连接池的情况:每个用户访问数据库的时候,都是自己创建连接对象
使用连接池的情况:一开始系统启动的时候就创建了一定数量的连接对象,使用的时候直接从连接池中去获取就可以了。不需要自己来创建连接对象。
连接池解决现状问题的原理
Connection连接对象 | 操作特点 |
---|---|
创建时 | 连接对象不再由自己创建,而是系统启动的时候已经创建一定数量的连接, 并且放在连接池中 |
使用时 | 直接从连接池中去获取一个已经创建好的连接对象即可 |
关闭时 | 不是真的关闭连接对象,而是将连接对象再放回到连接池中,供下一个用户使用 |
javax.sql.DataSource接口
实现类在哪?由第三方厂商来实现,只要实现这个接口都可以编写自己的连接池。
DataSource接口中的方法 | 描述 |
---|---|
Connection getConnection() | 从连接池中获取连接对象 |
每个连接池都有很多的参数,几乎所有的参数都是有默认的值的,我们也可以根据实际情况进行调整。参数名在不同的连接池中参数名是有区别的。
常用参数 | 描述 |
---|---|
初始连接数 | 服务器启动的时候创建的连接对象数量 |
最大连接数 | 连接池中最多可以允许放多少个连接对象 |
最长等待时间 | 如果连接池中没有连接对象,设置用户等待的最长时间是多久,单位是毫秒。 如果超过这个时间就抛出异常 |
最长空闲回收时间 | 如果一个连接对象长时间没有人使用,设置多久回收这个对象,默认是不回收。 |
池化思想
使用一个集合, 在初始时就创建一些连接存入其中.如果要使用连接, 则从集合中获取, 用完之后, 再把连接归还到集合中供后续使用.
作用:
可以节省创建连接的时间以及释放资源的时间.
DataSource
数据源.所有的连接池对象都需要实现该接口.
方法:
Connection getConnection() 获取连接池中的一个连接.从连接池中获取的连接, 它的close方法都被修改掉了.
连接的close方法不再释放资源, 而是把自己归还到连接池中
通常情况下,在一个项目中,连接池只会创建一个。这个项目中所有的dao都从这个连接池获取连接操作数据库。
实现(第三方连接池)
package com.itheima;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
public static void main(String[] args) throws SQLException {
//1.创建连接池,使用默认配置。ComboPooledDataSource实现了DataSource接口
//ComboPooledDataSource ds = new ComboPooledDataSource();
//使用命名配置
ComboPooledDataSource ds = new ComboPooledDataSource("otherc3p0");
//2.使用连接池,从连接池中获取10个连接对象
for (int i = 1; i <= 16; i++) {
Connection connection = ds.getConnection();
System.out.println("第" + i + "个连接对象:" + connection);
//第5个释放
if (i==5) {
//放回到连接池中
connection.close();
}
}
使用druid创建连接池,从连接池中得到连接对象,输出得到的连接对象。
导包
1 在src目录下创建一个properties文件,文件名随意,设置上面的参数
2 在src目录下新建一个DRUID配置文件,命名为:druid.properties
url=jdbc:mysql://localhost:3306/test
username=root
password=root
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
maxWait=2000
package com.itheima;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class Demo2Druid {
public static void main(String[] args) throws Exception {
//1.从类路径下加载配置文件,获取一个输入流。如果不指定路径,默认是读取同一个包下资源文件
InputStream inputStream = Demo2Druid.class.getResourceAsStream("/druid.properties");
//2.使用Properties对象的方法将配置文件中属性加载到Properties对象中
Properties properties = new Properties();
//加载了配置文件中所有的属性
properties.load(inputStream);
//3.通过druid的工厂类创建连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//获取10个连接对象
for (int i = 1; i <= 11; i++) {
Connection connection = dataSource.getConnection();
System.out.println("第" + i + "个连接对象:" + connection);
//第3个连接关闭
if (i==3) {
connection.close();
}
}
}