数据库连接池
设计概念: 共享型数据库连接库,管理员在库里放置了5~10个数据库连接的接口,用的时候给你一个,
用完再收回去,可以重复使用,而非使用一个损耗一个,有效提升了对数据库操作的性能。
减少内存碎片以及数据库临时进程的数量。(数据库连接池为数据库连接做好了初始化工作,
减少了应用连接数据库所需花费的初始化时间。可以为应用带来更快的响应速度。)
Datasource:
在Java包下的一个接口,javax.sql.Datasource。
实现了这个接口就可以借用里面的核心功能Connection 的getConnection方法进而获取数据库的连接对象,
从而去完成数据库连接池的技术。
自定义数据库连接池:
//1.定义一个类,实现Datasource接口。
public class MyDataSource implements DataSource {
//2.定义一个容器,保存多个connection连接对象。
private static List pool = Collections.synchronizedList(new ArrayList<>());
//3.定义静态代码块,通过 JDBC 工具类获取 10 个连接保存到容器中。
static {
for (int i = 1; i <=10 ; i++) {
Connection con = JDBCUtils.getConnection();
pool.add(con);
}
}
//4.重写 getConnection 方法,从容器中获取一个连接并返回。
@Override
public Connection getConnection() throws SQLException {
if(pool.size()>0){
Connection con = pool.remove(0);
return con;
}
else {
throw new RuntimeException("连接已用尽");
}
}
//5.定义 getSize 方法,用于获取容器的大小并返回。
public int getSize(){
return pool.size();
}
public class MyDataSourceTest {
public static void main(String[] args) throws Exception {
//1.创建连接池对象
MyDataSource myDataSource = new MyDataSource();
//2.通过连接池对象获取连接对象
Connection connection = myDataSource.getConnection();
//3.查询学生表的全部信息
String sql = "SELECT * FROM student";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//4.执行sql语句获取结果集
ResultSet resultSet = preparedStatement.executeQuery();
//5.处理结果集
while (resultSet.next()){
System.out.println(resultSet.getInt("sid")+"/t"+resultSet.getString("sname")+"/t"+resultSet.getString("sex")+"/t"+resultSet.getDate("birthday"));
}
//6.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
归还连接
1.继承方式归还:归还不了
① 定义一个类,继承 JDBC4Connection 。
② 定义 Connection 连接对象和连接池容器对象的成员变量。
③ 通过有参构造方法完成对成员变量的赋值。
④ 重写 close 方法,将连接对象添加到池中。
3. 继承方式归还数据库连接存在的问题。
通过查看 JDBC 工具类获取连接的方法发现:我们虽然自定义了一个子类,完成了归还连接的操作。但是
DriverManager 获取的还是 JDBC4Connection 这个对象,并不是我们的子类对象,而我们又不能整体
去修改驱动包中类的功能,所继承这种方式行不通!
2.归还连接-装饰设计模式
需要重写大量的方法,不是最优解。
3.归还连接-适配器设计模式
自定义连接类虽然很简洁了,但适配器类还是我们自己编写的,也比较的麻烦
4.动态代理
我们自己写的连接池技术不够完善,功能也不够强大。
开源数据库连接池
1. C3P0 数据库连接池的使用步骤。
① 导入 jar 包。
② 导入配置文件到 src 目录下。
③ 创建 C3P0 连接池对象。
④ 获取数据库连接进行使用。
2. Druid 数据库连接池的使用步骤。
① 导入 jar 包。
② 编写配置文件,放在 src 目录下。
③ 通过 Properties 集合加载配置文件。
④ 通过 Druid 连接池工厂类获取数据库连接池对象。
⑤ 获取数据库连接进行使用。
public class DruidTest1 {
public static void main(String[] args) throws Exception{
//获取配置文件的流对象
InputStream is = DruidTest1.class.getClassLoader().getResourceAsStream(“druid.properties”);
//1.通过Properties集合,加载配置文件
Properties prop = new Properties();
prop.load(is);
//2.通过Druid连接池工厂类获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//3.通过连接池对象获取数据库连接进行使用
Connection con = dataSource.getConnection();
String sql = "SELECT * FROM student";
PreparedStatement pst = con.prepareStatement(sql);
//4.执行sql语句,接收结果集
ResultSet rs = pst.executeQuery();
//5.处理结果集
while(rs.next()) {
System.out.println(rs.getInt("sid") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getDate("birthday"));
}
//6.释放资源
rs.close();
pst.close();
con.close();
}
}
自定义JDBC框架
在我们操作数据库的时候,会有大量的重复代码,我们将这些重复的代码封装到一起,为他们
各自编写相应的功能,可以让我们在操作数据库的时候直接调用方法,写入相应的sql语句,
加入对应的参数即可完成对数据库的操作。
DataBaseMetaData(数据库元数据)
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。