首页 > 代码库 > 数据库连接池

数据库连接池

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

  应用程序直接获取连接的缺点:缺点:用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

技术分享

技术分享

编写数据库连接池

  编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:

  Connection getConnection()
  Connection getConnection(String username, String password)
  实现DataSource接口,并实现连接池功能的步骤:
  (1)在DataSource构造函数或者静态代码块中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。
  (2)实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
  (3)当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。
  (4)Collection保证将自己返回到LinkedList中是此处编程的难点。

 使用动态代理技术构建连接池的Connection

      proxyConn = (Connection)       Proxy.newProxyInstance(this.getClass().getClassLoader(),conn.getClass().getInterfaces(),newInvocationHandler() {
                  //此处为内部类,当close方法被调用时将conn还回池中,其它方法直接执行
                    public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
                          if (method.getName().equals("close")) {
                          pool.addLast(conn);
                          return null;
                         }
                          return method.invoke(conn, args);
                      }
              });

开源数据库连接池 

   现在很多WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。也有一些开源组织提供了数据源的独立实现:DBCP 数据库连接池 ,C3P0 数据库连接池

实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。

  CBCP数据源

  DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
  Commons-dbcp.jar:连接池的实现
  Commons-pool.jar:连接池实现的依赖库
  Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

  使用DBCP数据源需要导入dbcpconfig.propertoes配置文件,并在其中修改参数配置。

技术分享

  C3P0数据源

  技术分享

  也可将配置参数写在配置文件c3p0-config.xml中(配置文件名固定)   

                    <?xml version="1.0" encoding="UTF-8"?>
                <c3p0-config>
                  <default-config>
                    <property name="driverClass">com.mysql.jdbc.Driver</property>
                    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
                    <property name="user">root</property>
                    <property name="password">root</property>

                    <property name="acquireIncrement">5</property>
                    <property name="initialPoolSize">10</property>
                    <property name="minPoolSize">5</property>
                    <property name="maxPoolSize">20</property>
                  </default-config>

                  <named-config name="mysql">
                    <property name="driverClass">com.mysql.jdbc.Driver</property>
                    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
                    <property name="user">root</property>
                    <property name="password">root</property>

                    <property name="acquireIncrement">5</property>
                    <property name="initialPoolSize">10</property>
                    <property name="minPoolSize">5</property>
                    <property name="maxPoolSize">20</property>
                  </named-config>


                  <named-config name="oracle">
                    <property name="driverClass">com.mysql.jdbc.Driver</property>
                    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
                    <property name="user">root</property>
                    <property name="password">root</property>

                    <property name="acquireIncrement">5</property>
                    <property name="initialPoolSize">10</property>
                    <property name="minPoolSize">5</property>
                    <property name="maxPoolSize">20</property>
                  </named-config>
                </c3p0-config>

         在程序中使用代码  

        ComboPooledDataSource ds= new ComboPooledDataSource();将自动加载配置文件

   Tomcat中配置数据源

  技术分享

 

数据库连接池