JDBC(四) 数据库连接池

来源:互联网 发布:linux可以做什么 编辑:程序博客网 时间:2024/05/21 09:48

数据库连接池

在程序中,每次直接去获取数据库连接,然后用完再释放,由于数据库创建连接需要消耗较多的资源,这里希望连接得到重用,采用数据库连接池的方案来解决这个问题,这也是池化思想的运用。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能

数据库连接池主要考虑到的因素有:
1. 最小连接数
是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2. 最大连接数
是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3. 最小连接数与最大连接数差距
最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

DBCP数据库连接池

很多web服务器都提供了DataSource的实现,即数据库连接池的实现,通常把DataSource的实现称为数据源,数据源包含了连接池的实现,例如dbcp就是java.sql.datasource接口的一种具体实现。也有开源组织提供的数据库连接池的独立实现:DBCP和C3P0,使用这些数据库连接池,不需要手动编写连接代码,只需要获取连接即可,方便,高效。

使用DBCP数据库连接池需要导入两个JAR包,commons-dbcp-1.2.2.jar、commons-pool.jar

在类目录下添加配置文件dbcp.properties

dbcp.properties:

#连接设置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/testjdbcusername=rootpassword=root#<!-- 初始化连接数 -->initialSize=10#最大连接数量maxActive=50#<!-- 最大空闲连接数 -->maxIdle=20#<!-- 最小空闲连接数 -->minIdle=5#<!-- 超时等待时间以毫秒为单位 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)。#可用值为下列之一:NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLEdefaultTransactionIsolation=READ_UNCOMMITTED

JdbcUtilsWithDBCP.java

package com.aaa.utils;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Properties;import org.apache.commons.dbcp.BasicDataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class JdbcutilsWithDBCP {    private static BasicDataSource basicDataSource = null;    // 在静态代码块中初始化数据库连接池    static {        try {            InputStream inputStream = JdbcutilsWithDBCP.class.getClassLoader()                    .getResourceAsStream("dbcp.properties");            Properties properties = new Properties();            properties.load(inputStream);            // 数据源工厂创建数据源            basicDataSource = (BasicDataSource) BasicDataSourceFactory                    .createDataSource(properties);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    public static synchronized Connection getConnection() {        try {            return basicDataSource.getConnection();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }    public static void relesaeDB(Connection connection,            PreparedStatement preparedStatement, ResultSet resultSet) {        if (connection != null) {            try {                connection.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        if (preparedStatement != null) {            try {                preparedStatement.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        if (resultSet != null) {            try {                resultSet.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

c3p0数据库连接池

使用c3p0数据库连接池需要导入jar包 c3p0-0.9.2-pre1.jar、mchange-commons-0.2.jar

在类目录下添加C3P0的配置文件:c3p0-config.xml

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/databasename</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>                 <property name="maxStatements">0</property>                <property name="maxStatementsPerConnection">5</property>             </default-config>    <named-config name="mysql">        <property name="driverClass">com.mysql.jdbc.Driver</property>        <property name="jdbcUrl">jdbc:mysql://localhost:3306/testjdbc        </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>        <property name="maxStatements">20</property>        <property name="maxStatementsPerConnection">5</property>    </named-config></c3p0-config>

JdbcUtilsWithC3P0.java:

package com.aaa.utils;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Properties;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcUtilsWithC3P0 {    private static ComboPooledDataSource comboPooledDataSource = null;    static {        try {            InputStream inputStream = JdbcUtilsWithC3P0.class.getClassLoader()                    .getResourceAsStream("c3p0-config.xml");            Properties properties = new Properties();            properties.load(inputStream);            // 配置文件可以用properties文件,也可以用xml,这里使用xml配置,(要放在类路径下)            // comboPooledDataSource = new ComboPooledDataSource(); // 使用默认配置            // 指定配置            comboPooledDataSource = new ComboPooledDataSource("mysql");        } catch (Exception e) {            // TODO: handle exception        }    }    public static synchronized Connection getConnection() {        try {            return comboPooledDataSource.getConnection();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }    public static void relesaeDB(Connection connection,            PreparedStatement preparedStatement, ResultSet resultSet) {        if (connection != null) {            try {                connection.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        if (preparedStatement != null) {            try {                preparedStatement.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        if (resultSet != null) {            try {                resultSet.close();            } catch (SQLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}
0 0
原创粉丝点击