ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

18-MySQL-数据库连接池

2021-01-28 00:00:28  阅读:162  来源: 互联网

标签:java 18 sql pst MySQL import 连接 连接池


MySQL -> 数据库连接池

  • 编写连接池,实现一个接口——DataSource
  • 开源数据源实现(拿来即用)
    • DBCP
    • C3P0
    • Druid : 阿里巴巴
  • 使用里这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了
1. DBCP
  • 需要用到的jar包

    • commons-dbcp-1.4 :连接池的实现
    • commons-pool-1.6 :连接池实现的依赖库
  • dbcpconfig.properties

#连接设置
driverClassName = com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&CharacterEncoding=utf8&useSSL=true
username = root
password = 123456

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

#最大连接数量
maxActive = 50

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

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

#<!-- 超时等待时间以毫秒为单位60000毫秒/1000等于60秒 -->
maxWait = 60000

connectionProperties = useUnicode=true;CharacterEncoding=utf8

defaultAutoCommit = true

defaultReadOnly=

defaultTransactionIsolation = READ_UNCOMMITTED

  • JdbcUtils_JDBC.java
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils_DBCP {
    private static DataSource dataSource = null;

    static {
        try{
            InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
            Properties properties = new Properties();
            properties.load(in);
            //创建数据源 工厂模式--创建对象
            dataSource = BasicDataSourceFactory.createDataSource(properties);


        } catch (Exception e){
            e.printStackTrace();
        }
    }

    //获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection(); //从数据源中获取连接
    }
    //释放资源
    public static void release(Connection conn, Statement st, ResultSet rs){
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(st!=null){
            try {
                st.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}
  • TestDBCP.java
import com.anobabe.lesson05.utils.JdbcUtils_DBCP;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;

public class TestDBCP {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pst = null;


        try {
            conn = JdbcUtils_DBCP.getConnection();
            // 与Statement的区别:使用?占位符代表参数
            String sql = "INSERT INTO users(`id`,`name`,`password`,`email`,`birthday`) VALUES (?,?,?,?,?)";
            pst = conn.prepareStatement(sql);
            pst.setInt(1,5);
            pst.setString(2,"Jay");
            pst.setString(3,"111111");
            pst.setString(4,"jay@sina.com");
            //注意点:java.sql.Date  -- 数据库
            //      java.util.Date -- Java  new Date().getTime()获得时间戳
            pst.setDate(5,new java.sql.Date(new Date().getTime()));

            //执行:预编译执行不用穿参数
            int i = pst.executeUpdate();
            if(i>0){
                System.out.println("插入成功!");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JdbcUtils_DBCP.release(conn,pst,null);
        }
    }
}
2. C3P0
  • 需要用到的jar包

    • c3p0-0.9.5.5.jar
    • mchange-commons-java-0.2.19.jar
  • c3p0配置文件:c3p0-config.xml

<?xml version="1.0" encoding="UTF-8" ?>

<c3p0-config>
    <default-config>

        <property name="user">root</property> //数据库用户名
        <property name="password">123456</property> //数据库密码
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/sys</property>//jdbc数据库连接地址
        <property name="driverClass">com.mysql.jdbc.Driver</property>//加载相应数据库驱动


        <property name="checkoutTimeout">30000</property>//当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。
        <property name="idleConnectionTestPeriod">30</property>//每个几秒检查所有连接池中的空闲连接
        <property name="initialPoolSize">10</property>//连接池初始化时创建的连接数
        <property name="maxIdleTime">30</property>//连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接如果为0,则永远不会断开连接
        <property name="maxPoolSize">20</property>连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大
        <property name="minPoolSize">5</property>连接池保持的最小连接数,后面的maxIdleTimeExcessConnections跟这个配合使用来减轻连接池的负载
        <property name="acquireIncrement">5</property>//连接池在无空闲连接可用时一次性创建的新数据库连接数
        <property name="maxIdleTimeExcessConnection">25</property>//单位秒,为了减轻连接池的负载,当连接池经过数据访问高峰创建了很多连接,但是后面连接池不需要维护这么多连接,必须小于maxIdleTime.配置不为0,则将连接池的数量保持到minPoolSize

    </default-config>

    <named-config name="MySQL">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true</property>
        <property name="user">root</property>
        <property name="password">123456</property>

        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>//连接池初始化时创建的连接数
        <property name="maxPoolSize">20</property>连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大
        <property name="minPoolSize">5</property>连接池保持的最小连接数,后面的maxIdleTimeExcessConnections跟这个配合使用来减轻连接池的负载
    </named-config>

</c3p0-config>
  • new ComboPooledDataSource();
  • new ComboPooledDataSource(“MySQL”);

结论:无论使用什么数据源,本质还是一样的,均是使用DataSource接口,方法不变。

标签:java,18,sql,pst,MySQL,import,连接,连接池
来源: https://blog.csdn.net/baidu_38126306/article/details/113284286

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有