美文网首页
java_数据库连接池

java_数据库连接池

作者: 走停2015_iOS开发 | 来源:发表于2021-02-08 11:03 被阅读0次
JDBC开发流程
  • 加载驱动
  • 建立数据库连接(connect)
  • 执行SQL语句(statement)
  • ResultSet接受结果集(查询)
  • 断开连接 释放资源

1.数据库连接对象是通过DriverManager来获取的,每次获取都需要向数据库申请获取连接,验证用户名和密码,执行完SQL语句后断开连接,这样的方式会造成资源的浪费,数据连接资源没有得到很好的重复利用。
可以使用数据库连接池解决这一问题
2.数据库连接池的基本思想就是为数据库建立一个缓冲池,预先向缓冲池放入一定数量的连接对象,供下一次请求的使用,做到了资源的重复利用,允许程序重复使用一个现有的数据库连接对象,而不需要重新创建

数据库连接池实现

JDBC的数据库连接池使用javax.sql.Datasource来完成的。
javax表示java后来扩展的一部分内容
javax.sql.Datasource 是java官方提供的接口,使用的时候开发者不需要自己来实现该接口,可以使用第三方的工具,C3P0是一个常用的第三方实现 C3P0下载地址

  1. 导入jar包{mchange-commons-java-0.2.19.jar,c3p0-0.9.5.5.jar}
  2. 编写代码
  3. 可以将C3P0的配置信息定义在xml文件中,java程序只需要加载配置文件即可完成数据库连接池的初始化操作
  4. &转义:&
        //创建c3p0
        try {
            String url = "jdbc:mysql://localhost:3306/bjpowernode";
            String user = "root";
            String pwd = "12345678";
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
            comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
            comboPooledDataSource.setJdbcUrl(url);
            comboPooledDataSource.setUser(user);
            comboPooledDataSource.setPassword(pwd);
//            设置初始化连接数量
            comboPooledDataSource.setInitialPoolSize(20);
//            设置最大连接数量
            comboPooledDataSource.setMaxPoolSize(40);
//            当连接对象不够时,再次申请的连接个数
            comboPooledDataSource.setAcquireIncrement(5);
//            当连接对象剩余2个时候就会去申请
            comboPooledDataSource.setMinPoolSize(2);
            Connection connection = comboPooledDataSource.getConnection();
            System.out.println(connection);
        } catch (PropertyVetoException | SQLException e) {
            e.printStackTrace();
        } 

xml配置文件

  • 配置文件的名字必须是c3p0-config.xml
  • 初始化comboPooledDataSource时 传入的参数必须是c3p0-config.xmlnamed-config标签的name
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">
            jdbc:mysql://localhost:3306/blog?useSSL=false&amp;serverTimezone=UTC
        </property>
        <property name="user">root</property>
        <property name="password">toor</property>
        <property name="initialPoolSize">10</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">60</property>
        <property name="maxStatements">200</property>
    </default-config>
    <named-config name="mysql5">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/w_blog</property>
        <property name="user">root</property>
        <property name="password"></property>
        <property name="initialPoolSize">30</property>
        <property name="maxPoolSize">60</property>
    </named-config>
    <named-config name="mysql8">
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/w_blog?useSSL=false&amp;serverTimezone=UTC</property>
        <!-- 使用&amp;代替& -->
        <property name="user">root</property>
        <property name="password">toor</property>
        <property name="initialPoolSize">300</property>
        <property name="maxPoolSize">400</property>
    </named-config>
</c3p0-config>

DBUtils工具

DBUtils:可以帮助开发者完成数据的封装,把结果集映射到java对象

DBUtils中的类
1.导入jar包 下载地址
2.使用
下面用到可变参数 Object... params
    public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
        return this.query(conn, false, sql, rsh, params);
    }

    public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh) throws SQLException {
        return this.query(conn, false, sql, rsh, (Object[])null);
    }

ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql_name");
QueryRunner run = new QueryRunner(dataSource);
// Use the BeanHandler implementation to convert the first
// ResultSet row into a Person JavaBean.
ResultSetHandler<Person> h = new BeanHandler<Person>(Person.class);
// Execute the SQL statement with one replacement parameter and
// return the results in a new Person object generated by the BeanHandler.
Person p = run.query(
    "SELECT * FROM Person WHERE name=?", h, "John Doe"); 

相关文章

网友评论

      本文标题:java_数据库连接池

      本文链接:https://www.haomeiwen.com/subject/bwuxxltx.html