连接池学习(1)

来源:互联网 发布:mac air qq 远程桌面 编辑:程序博客网 时间:2024/06/06 07:16

一、问题提出

(1)传统的连接数据库的形式为:


存在的问题:

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


(2)使用连接池


目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能


二、连接池的基本思想

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使

用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量?使用情

况,为系统开发?测试及性能调整提供依据。


三、常见连接池的使用

现在很多WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据

源中都包含了数据库连接池的实现

1、DBCP

DBCP:Apache推出的Database Connection Pool

使用步骤:

> 添加jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar

> 添加属性资源文件

> 编写数据源工具类

编写一个工具类DBCPUtil.Java
package com.xfcy.utils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class DBCPUtil {private static DataSource ds=null;static{Properties prop=new Properties();try {prop.load(DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));//根据DBCPUtil的classes的路径,加载配置文件ds=BasicDataSourceFactory.createDataSource(prop);//得到一个数据源} catch (Exception e) {throw new ExceptionInInitializerError("初始化错误,请检查配置文件");}}public static Connection getConnection(){try {return ds.getConnection();} catch (SQLException e) {// TODO Auto-generated catch blockthrow new RuntimeException("服务器忙……");}}public static void release(Connection conn,Statement stmt,ResultSet rs){//关闭资源if(rs!=null){try {rs.close();} catch (Exception e) {e.printStackTrace();}rs = null;}if(stmt!=null){try {stmt.close();} catch (Exception e) {e.printStackTrace();}stmt = null;}if(conn!=null){try {conn.close();//关闭} catch (Exception e) {e.printStackTrace();}conn = null;}}}


在dbcpconfig.properties中
#连接设置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/day13username=rootpassword=root#<!-- 初始化连接 -->initialSize=10#最大连接数量maxActive=50#<!-- 最大空闲连接 -->maxIdle=20#<!-- 最小空闲连接 -->minIdle=5#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->maxWait=60000#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。connectionProperties=useUnicode=true;characterEncoding=utf8#指定由连接池所创建的连接的自动提交(auto-commit)状态。defaultAutoCommit=true#driver default 指定由连接池所创建的连接的只读(read-only)状态。#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)defaultReadOnly=#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLEdefaultTransactionIsolation=REPEATABLE_READ


测试代码为:

package com.itheima.test;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import org.junit.Test;import com.itheima.utils.DBCPUtil;public class TestJDBC {@Testpublic void test1(){Connection conn = null;PreparedStatement ps = null;try {conn = DBCPUtil.getConnection();ps = conn.prepareStatement("...");//...} catch (SQLException e) {e.printStackTrace();}finally{DBCPUtil.release(conn, ps, null);}}}


2、C3P0

使用步骤:

1、添加jar包

2、编写配置文件

c3p0-config.xml,放在classpath中,或classes目录中

编写一个工具类C3P0Util.java

package com.xfcy.util;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3P0Util {//得到一个数据源private static DataSource dataSource = new ComboPooledDataSource();//从数据源中得到一个连接对象public static Connection getConnection(){try {return dataSource.getConnection();} catch (SQLException e) {throw new RuntimeException("服务器错误");}}public static void release(Connection conn,Statement stmt,ResultSet rs){//关闭资源if(rs!=null){try {rs.close();} catch (Exception e) {e.printStackTrace();}rs = null;}if(stmt!=null){try {stmt.close();} catch (Exception e) {e.printStackTrace();}stmt = null;}if(conn!=null){try {conn.close();//关闭} catch (Exception e) {e.printStackTrace();}conn = null;}}}


配置文件可以是.xml文件,或者Properties文件或者是Java内写入static静态加载代码。下面以.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/test</property><property name="user">root</property><property name="password">root</property>    <property name="initialPoolSize">10</property>    <property name="maxIdleTime">30</property>    <property name="maxPoolSize">100</property>    <property name="minPoolSize">10</property>  </default-config></c3p0-config>


测试代码

package com.xfcy.util;import java.sql.Connection;import java.sql.PreparedStatement;import org.junit.Test;public class TestCRUD {@Testpublic void testInsert(){Connection conn = null;PreparedStatement ps = null;try {conn = C3P0Util.getConnection();ps = conn.prepareStatement("insert into testone(name,money) values('王五',2000)");ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally{C3P0Util.release(conn, ps, null);}System.out.println(conn.getClass().getName());}}

运行结果:












0 0