• 连接池快速入门


    • 目录

      数据库连接的背景

      数据库连接池

      DataSource

      自定义数据库连接池

      演示

      测试


    • 数据库连接的背景

    • 数据库连接是一种关键的、有限的、昂贵的资源
    • 这一点在多用户的网页应用程序中体现得尤为突出
    • 对数据库连接的管理能显著影响到整个应用程序的性能指标,数据库连接池正是针对这个问题提出来的
    • 如:在用户访问网站时不断创建连接不断销毁连接,那么这个效率就不是很高
    • 数据库连接池

    • 数据库连接池负责分配,管理和释放数据库连接
    • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
    • 这项技术能明显提高对数据库操作的性能
    • 简要过程:
    • 就是提前准备一个容器,这个容器就是数据库的连接池,在容器中,提前准备好了一些数据库连接
    • 这时来了请求后,就从连接池中拿一个连接对象进行使用
    • 使用完成以后不关掉,而是归还到连接池当中,达到重复使用的效果
    • 所谓的池,就是搞一个容器,这个容器里边保存的就是很多个数据库连接对象
    • DataSource

    • DataSource接口概述
    • javax.sql.DataSourse接口:数据源(数据库连接池)
    • Java官方提供的数据库连接池规范(接口)
    • 如果想完成数据库连接池技术,就必须实现DataSource接口
    • 核心功能:
    • 获取数据库连接对象:
    • Connection getConnection();
    • 自定义数据库连接池

    • 1.定义一个类,实现DataSource接口
    • 2.定义一个容器,用于保存多个Connection连接对象
    • 3.定义静态代码块,通过JDBC工具类获取10个连接保存到容器中
    • 4.重写getConnection方法,从容器中获取一个连接并返回
    • 5.定义getSize方法,用于获取容器的大小并返回
    • 演示

      1. package demo02.myDataSourse;
      2. import demo02.utils.JDBCUtils;
      3. import javax.sql.DataSource;
      4. import java.io.PrintWriter;
      5. import java.sql.Connection;
      6. import java.sql.SQLException;
      7. import java.sql.SQLFeatureNotSupportedException;
      8. import java.util.ArrayList;
      9. import java.util.Collections;
      10. import java.util.List;
      11. import java.util.logging.Logger;
      12. //自定义数据库连接池
      13. public class demoDataSourse implements DataSource{
      14. //1.准备容器,用于保存多个连接对象
      15. private static List pool = Collections.synchronizedList(new ArrayList<>());
      16. //2.定义静态代码块,通过工具类获取10个连接对象
      17. static{
      18. for(int i=1;i<=10;i++){
      19. Connection con = JDBCUtils.getConnection();
      20. pool.add(con);
      21. }
      22. }
      23. //3.重写getConnection(),用于获取一个连接对象
      24. @Override
      25. public Connection getConnection() throws SQLException {
      26. if(pool.size()>0){
      27. Connection con = pool.remove(0);
      28. return con;
      29. }else{
      30. throw new RuntimeException("连接数量已用尽");
      31. }
      32. }
      33. //4.定义getSize方法,获取连接池容器的大小
      34. public int getSize(){
      35. return pool.size();
      36. }
      37. @Override
      38. public Connection getConnection(String username, String password) throws SQLException {
      39. return null;
      40. }
      41. @Override
      42. public T unwrap(Class iface) throws SQLException {
      43. return null;
      44. }
      45. @Override
      46. public boolean isWrapperFor(Class iface) throws SQLException {
      47. return false;
      48. }
      49. @Override
      50. public PrintWriter getLogWriter() throws SQLException {
      51. return null;
      52. }
      53. @Override
      54. public void setLogWriter(PrintWriter out) throws SQLException {
      55. }
      56. @Override
      57. public void setLoginTimeout(int seconds) throws SQLException {
      58. }
      59. @Override
      60. public int getLoginTimeout() throws SQLException {
      61. return 0;
      62. }
      63. @Override
      64. public Logger getParentLogger() throws SQLFeatureNotSupportedException {
      65. return null;
      66. }
      67. }
    • 测试

    • 此处测试未对连接对象进行归还,而是直接关闭
    • 演示中有影响结果,后面再介绍如何归还
      1. package demo02.myDataSourse;
      2. import java.sql.Connection;
      3. import java.sql.PreparedStatement;
      4. import java.sql.ResultSet;
      5. public class demoDataSourseTest {
      6. public static void main(String[] args) throws Exception {
      7. //1.创建连接池对象
      8. demoDataSourse dataSourse = new demoDataSourse();
      9. System.out.println("使用之前的数量" + dataSourse.getSize());
      10. //2.通过连接池对象获取连接对象
      11. Connection con = dataSourse.getConnection();
      12. //3.查询学生表的全部信息
      13. String sql = "SELECT * FROM student";
      14. PreparedStatement pst = con.prepareStatement(sql);
      15. //4.执行sql语句,接收结果集
      16. ResultSet rs = pst.executeQuery();
      17. //5.处理结果集
      18. while(rs.next()){
      19. System.out.println(rs.getInt("sid")+"\t"+rs.getString("name")+"\t"+rs.getInt("age")+"\t"+rs.getDate("birthday"));
      20. }
      21. //6.释放资源
      22. rs.close();
      23. pst.close();
      24. con.close();//用完以后,未归还进行关闭连接;归还后面再讲
      25. System.out.println("使用之后的数量" + dataSourse.getSize());
      26. }
      27. }
  • 相关阅读:
    mysql数据库导出
    myBatis简单全面
    windows系统mysql服务启动失败
    信息学奥赛一本通 2074:【21CSPJ普及组】分糖果(candy) | 洛谷 P7909 [CSP-J 2021] 分糖果
    postman自动化运行接口测试用例
    如何安装Xftp实现上传和下载文件
    [附源码]java毕业设计哈金院快递驿站管理信息系统
    苹果手机丢了如何通过定位找回?iPhone手机丢失定位找回方法
    VTK与OpenGL是什么,有什么关系?
    Scala基础教程--14--隐式转换
  • 原文地址:https://blog.csdn.net/weixin_59624686/article/details/125997103