常用的数据库连接池使用

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 常用的数据库连接池使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

5.数据库连接池

  • 池化技术:准备一下预先的资源,供连接,原因是连接-释放浪费系统资源
  • 最小连接数
  • 最大连接数
  • 等待超时
  • 编写连接池,实现一个接口javax.sql.DataSource

开源数据源实现(直接用,jar包中已实现)

DBCP

C3P0

Druid:阿里,有监控,配置为顶配是速度慢下来

  • 使用了这些DB连接池,不需要编写连接数据库代码
5.1 DBCP
  • 需要commons-dbcp-1.4.jar、commons-pool-1.6.jar包
#连接设置 name是dbcp设置好的,供dbcp读取
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username=root
password=123456

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

#最大连接数量
maxActive=50

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

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

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;】
maxWait=60000

#注意:"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, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED
private static DataSource dataSource = null;
static {
    //db.properties配置文件放在src目录,可以直接读取到
    //若放在项目包目录下,需要加路径
    try {
        InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
        Properties properties = new Properties();
        properties.load(in);
        //创建数据源--通过工厂模式
        dataSource = BasicDataSourceFactory.createDataSource(properties);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}
public static Connection getConnection() throws SQLException {
    return dataSource.getConnection();  //从数据源获取链接
}

public static void close(Connection connection, Statement statement, ResultSet resultSet){
    //按顺序释放
    if (resultSet!=null){
        try {
            resultSet.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (statement!=null){
        try {
            statement.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (connection!=null){
        try {
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
5.2 C3P0
  • 需要c3p0-0.9.5.5.jar/mchange-commons-java-0.2.20.jar
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!--c3p0的缺省(默认)配置如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource();"这样写就表示使用的是c3p0的缺省(默认)-->
    <default-config>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&amp;characterEncoding=utf8&amp;uesSSL=false&amp;serverTimezone=UTC</property>
        <property name="user">root</property>
        <property name="password">123456</property>

        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>
    <!--c3p0的配置如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource("mysql");"这样写就表示使用的是c3p0的mysql配置的数据库-->
    <name-config name="mysql">
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&amp;characterEncoding=utf8&amp;uesSSL=false&amp;serverTimezone=UTC</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <!--获得增量-->
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </name-config>
</c3p0-config>
public class JdbcUtils_Dbcp {
    private static DataSource dataSource = null;
    static {
        //db.properties配置文件放在src目录,可以直接读取到
        //若放在项目包目录下,需要加路径
        try {
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
            Properties properties = new Properties();
            properties.load(in);
            //创建数据源--通过工厂模式
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();  //从数据源获取链接
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet){
        //按顺序释放
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
private static void insertMethod() {
    Connection connection = null;
    PreparedStatement pstm = null;
    ResultSet resultSet = null;

    try {
        connection = JdbcUtils_c3p0.getConnection();
        //关闭数据库自动提交,自动会开启事务
        connection.setAutoCommit(false); //开启事务
        //区别
        //使用?作为占位符
        String sql = "INSERT INTO `users`(`name`,`PASSWORD`,`email`,`birthday`) VALUES(?,?,?,?)";
        //先写下面这个预编译的方法,上面的sql会提示
        pstm = connection.prepareStatement(sql); //预编译,先写sql然后不执行
        pstm.setString(1,"华安");
        pstm.setString(2,"9527");
        pstm.setString(3,"123456789@163.com");
        //注意:sql.date 数据库支持的 java.sql.Date
        //      util.Date java  new.Date.gettime() 获得时间戳
        pstm.setDate(4,new Date(System.currentTimeMillis()));
        boolean flag = pstm.execute();  //返回ResultSet为true,否则相反
        //业务完毕提交事务
        connection.commit();
        int num = pstm.executeUpdate();  //受影响行数
        if(num>0){
            System.out.println("插入成功");
        }
    } catch (SQLException throwables) {
        try {
            //不写也会回滚
            connection.rollback();  //如果失败就回滚
        } catch (SQLException e) {
            e.printStackTrace();
        }
        throwables.printStackTrace();
    }finally {
        JdbcUtils_c3p0.close(connection,pstm,resultSet);
    }
}
  • 其他数据源,本质是一样的,DataSource接口不变,dataSource.getConnection()方法就不变

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123957.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!