目录
数据库连接的背景
- 数据库连接是一种关键的、有限的、昂贵的资源
- 这一点在多用户的网页应用程序中体现得尤为突出
- 对数据库连接的管理能显著影响到整个应用程序的性能指标,数据库连接池正是针对这个问题提出来的
- 如:在用户访问网站时不断创建连接不断销毁连接,那么这个效率就不是很高
数据库连接池
- 数据库连接池负责分配,管理和释放数据库连接
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 这项技术能明显提高对数据库操作的性能
- 简要过程:
- 就是提前准备一个容器,这个容器就是数据库的连接池,在容器中,提前准备好了一些数据库连接
- 这时来了请求后,就从连接池中拿一个连接对象进行使用
- 使用完成以后不关掉,而是归还到连接池当中,达到重复使用的效果
- 所谓的池,就是搞一个容器,这个容器里边保存的就是很多个数据库连接对象
DataSource
- DataSource接口概述
- javax.sql.DataSourse接口:数据源(数据库连接池)
- Java官方提供的数据库连接池规范(接口)
- 如果想完成数据库连接池技术,就必须实现DataSource接口
- 核心功能:
- 获取数据库连接对象:
- Connection getConnection();
自定义数据库连接池
- 1.定义一个类,实现DataSource接口
- 2.定义一个容器,用于保存多个Connection连接对象
- 3.定义静态代码块,通过JDBC工具类获取10个连接保存到容器中
- 4.重写getConnection方法,从容器中获取一个连接并返回
- 5.定义getSize方法,用于获取容器的大小并返回
演示
package demo02.myDataSourse; import demo02.utils.JDBCUtils; import javax.sql.DataSource; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Logger; //自定义数据库连接池 public class demoDataSourse implements DataSource{ //1.准备容器,用于保存多个连接对象 private static List<Connection> pool = Collections.synchronizedList(new ArrayList<>()); //2.定义静态代码块,通过工具类获取10个连接对象 static{ for(int i=1;i<=10;i++){ Connection con = JDBCUtils.getConnection(); pool.add(con); } } //3.重写getConnection(),用于获取一个连接对象 @Override public Connection getConnection() throws SQLException { if(pool.size()>0){ Connection con = pool.remove(0); return con; }else{ throw new RuntimeException("连接数量已用尽"); } } //4.定义getSize方法,获取连接池容器的大小 public int getSize(){ return pool.size(); } @Override public Connection getConnection(String username, String password) throws SQLException { return null; } @Override public <T> T unwrap(Class<T> iface) throws SQLException { return null; } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { return false; } @Override public PrintWriter getLogWriter() throws SQLException { return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { } @Override public void setLoginTimeout(int seconds) throws SQLException { } @Override public int getLoginTimeout() throws SQLException { return 0; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { return null; } }
测试
- 此处测试未对连接对象进行归还,而是直接关闭
- 演示中有影响结果,后面再介绍如何归还
package demo02.myDataSourse; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class demoDataSourseTest { public static void main(String[] args) throws Exception { //1.创建连接池对象 demoDataSourse dataSourse = new demoDataSourse(); System.out.println("使用之前的数量" + dataSourse.getSize()); //2.通过连接池对象获取连接对象 Connection con = dataSourse.getConnection(); //3.查询学生表的全部信息 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();//用完以后,未归还进行关闭连接;归还后面再讲 System.out.println("使用之后的数量" + dataSourse.getSize()); } }
本文含有隐藏内容,请 开通VIP 后查看