后台(20)——数据库连接池

探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


版权声明


数据库连接池简介

在前面的文章中我们已经介绍了Web开发和数据库。现在来想这么一个问题:在同一时间段有大量用户访问我们的服务端,那么此时的服务器数据库它忙得过来么?诚然,它是需要一个好帮手的——数据库连接池

数据库连接池负责分配、管理和释放数据库连接。它允许程序重复使用一个现有的数据库连接,而不是再重新建立一个。数据库连接池可自动释放闲置时间超过最大空闲时间的数据库连接从而避免因为没有释放数据库连接而引起的数据库连接遗漏。这些技术均能明显提高数据库操作性能。目前,常见的数据库连接池有DBCP、C3P0等,现分别介绍他们。


DBCP

DBCP(DataBase Connection Pool)由Apache研发,而且Tomcat的连接池也正是采用DBCP实现的,该数据库连接池既可与应用服务器整合使用,也可由应用程序独立使用。

在此,以完整示例介绍DBCP的使用

第一步:添加jar包

  • commons-dbcp.jar
  • commons-pool.jar
  • mysql-connector-java-5.0.8-bin.jar

第二步:编写DBCP的配置文件dbcpconfig.properties

#<!-- 连接设置 -->
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db1
username=root
password=root

#<!-- 初始化连接 -->
initialSize=10

#<!-- 最大连接数量 -->
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间(单位毫秒) -->
maxWait=50000

#<!-- 编码方式 -->
connectionProperties=useUnicode=true;characterEncoding=utf8

##<!-- 指定由连接池所创建的连接自动提交 -->
defaultAutoCommit=true

#<!-- 指定由连接池所创建的连接的事务级别 -->
defaultTransactionIsolation=REPEATABLE_READ

第三步:编写操作DBCP的工具类DBCPUtil

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
package cn.com;

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 dataSource = null;
    //创建数据库连接池
    static{
        Properties properties = new Properties();
        try {
            ClassLoader classLoader=DBCPUtil.class.getClassLoader();
            properties.load(classLoader.getResourceAsStream("dbcpconfig.properties"));
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new ExceptionInInitializerError("DBCP始化错误,请检查配置文件");
        }
    }

    //创建连接
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException("数据库连接错误");
        }
    }

    //释放连接
    public static void releaseConnection(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;
        }
    }

}

第四步:测试DBCP的使用

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
package cn.com;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;

public class TestDBCP {
    @Test
    public void testDBCP(){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet=null;

        try {
            connection = DBCPUtil.getConnection();
            preparedStatement = connection.prepareStatement("select * from student");
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                Student student = new Student();
                int id = resultSet.getInt("studentid");
                String name = resultSet.getString("studentname");
                student.setStudentID(id);
                student.setStudentName(name);
                System.out.println(student);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            DBCPUtil.releaseConnection(connection, preparedStatement, resultSet);
        }       
    }
}

运行结果如下图所示:

这里写图片描述


C3P0

C3P0是一个开源的JDBC连接池,目前有Hibernate,Spring等框架也使用该数据库连接池。

在此,以完整示例介绍C3P0的使用

第一步:添加jar包

  • c3p0-0.9.1.2.jar
  • mysql-connector-java-5.0.8-bin.jar

第二步:编写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/db1</property>
    <property name="user">root</property>
    <property name="password">root</property>
    <property name="initialPoolSize">15</property>
    <property name="maxIdleTime">40</property>
    <property name="maxPoolSize">150</property>
    <property name="minPoolSize">20</property>
  </default-config>
</c3p0-config>

第三步:编写操作C3P0的工具类C3P0Util

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
package cn.com;

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 releaseConnection(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;
        }
    }
}

第四步:测试C3P0的使用

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
package cn.com;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;


public class TestC3P0 {
    @Test
    public void testC3P0(){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet=null;

        try {
            connection = C3P0Util.getConnection();
            preparedStatement = connection.prepareStatement("select * from student");
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                Student student = new Student();
                int id = resultSet.getInt("studentid");
                String name = resultSet.getString("studentname");
                student.setStudentID(id);
                student.setStudentName(name);
                System.out.println(student);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            C3P0Util.releaseConnection(connection, preparedStatement, resultSet);
        }       
    }
}

运行结果如下图所示:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值