本文共 6651 字,大约阅读时间需要 22 分钟。
在前面的文章中我们已经介绍了Web开发和数据库。现在来想这么一个问题:在同一时间段有大量用户访问我们的服务端,那么此时的服务器数据库它忙得过来么?诚然,它是需要一个好帮手的——数据库连接池
数据库连接池负责分配、管理和释放数据库连接。它允许程序重复使用一个现有的数据库连接,而不是再重新建立一个。数据库连接池可自动释放闲置时间超过最大空闲时间的数据库连接从而避免因为没有释放数据库连接而引起的数据库连接遗漏。这些技术均能明显提高数据库操作性能。目前,常见的数据库连接池有DBCP、C3P0等,现分别介绍他们。
DBCP(DataBase Connection Pool)由Apache研发,而且Tomcat的连接池也正是采用DBCP实现的,该数据库连接池既可与应用服务器整合使用,也可由应用程序独立使用。
在此,以完整示例介绍DBCP的使用
第一步:添加jar包
第二步:编写DBCP的配置文件dbcpconfig.properties
# driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/db1username=rootpassword=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是一个开源的JDBC连接池,目前有Hibernate,Spring等框架也使用该数据库连接池。
在此,以完整示例介绍C3P0的使用
第一步:添加jar包
第二步:编写C3P0的配置文件c3p0-config.xml
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/db1 root root 15 40 150 20
第三步:编写操作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); } }}
运行结果如下图所示: