13.数据库连接池

/*使用数据库连接池优化程序性能*/ 

一次性从数据库中拿出一定数量的连接,放到一个池子中,每次程序要拿连接的时候,从这个池子里面去拿,用完了,也是放到这个池子里,

避免频繁的从数据库中去存取连接

编写自己的数据库连接池

  1.实现DataSource接口 ,DataSource接口中定义了两个重载的getConnection() 方法

  2.在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中

   实现getConnection()方法,让getConnection()方法每次调用时,从LinkedList中取一个connection (remove方法) 返回给用户

  3.当用户使用完connection,调用connection.close() 方法时,connection对象应保证自己返回到LinkedList中,而不要把connection 还给数据库

  针对 “返回到LinkedList中,而不要把connection 还给数据库” 这种需要增强某个方法,有三种方式实现

    1.编写一个子类(继承Connection) 覆盖close方法 (这里不可以,因为父类的其他信息,子类并不拥有)

    2.写一个Connection包装类,增强close方法 (包装设计模式)

    3.用动态代理,返回一个代理对象出去,拦截close方法的调用,对close方法进行增强

    (不是clsoe方法,都调用invoke方法(让其调用connection自身的方法),是close方法的话,手动增强)


/*用包装设计模式对某个对象进行增强*/

  1.写一个类,实现与被增强对象(mysql的connection)接口

  2.定义一个变量,指向被增强对象

  3.定义一个构造方法,接收被增强对象

  4.覆盖想增强的方法

  5.对于不想增强的方法,直接调用被增强对象的方法


/*加入dbcp链接池*/

  1.导入jar包

  2.在类目录下加入dbcp的配置文件

  3.在jdbcUtils静态代码块中创建池


/*C3P0数据库连接池*/

  1.导入jar包

  2.新建c3p0Test.java单元测试类

  3.打开c3p0的doc帮助文档

  4.选择QuickStart快速开始

  5.拷贝里边的实例代码

  6.修改各个参数

采用配置文件配置数据源

  1.打开帮助文档

  2.找到XML文件示例

  3.在工程中新建c3p0-config.xml文件

  4.拷贝XML示例文件,修改参数 ( <property></property> )

  private static ComboPooledDataSource ds = null;
  static {

    try {

      ds = new ComboPooledDataSource("...");(如果括号为空,没有指定的话,则采用默认) 

    }

  }

/*配置Tomcat数据源(实际上是DBCP)*/

  1.在Tomcat中加入数据库驱动软件(放在web工程中的lib 中没有用,需要放在Tomcat的lib目录下)

  2.配置context(可以在很多地方,可以修改tomcat的service.xml文件,也可以在web工程中)

  META-INF目录下,新建一个XML文件,拷贝Tomcat帮助文档中的示例代码

  3.使用JNDI获取连接对象

  Context initCtx = new InitialContext(); //初始化JNDI

  Context envCtx = (Context) initCtx.lookup("java:comp/env"); //得到JNDI容器

  DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); //从容器中检索连接池

  Connection conn = ds.getConnection();

原文地址:https://www.cnblogs.com/xuzekun/p/7359459.html