• Druid连接池的使用


    Druid简介

    Druid是阿里开源的数据库连接池,作为后起之秀,性能比dbcp、c3p0更高,使用也越来越广泛。

    当然Druid不仅仅是一个连接池,还有很多其他的功能。

    druid的优点

    • 高性能。性能比dbcp、c3p0高很多。
    • 只要是jdbc支持的数据库,druid都支持,对数据库的支持性好。并且Druid针对oracle、mysql做了特别优化。
    • 提供监控功能。可以监控sql语句的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈等信息,来了解连接池、sql语句的工作情况,方便统计、分析SQL的执行性能

    Druid的使用

    添加druid的依赖、数据库驱动

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.8</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.19</version>
            </dependency>    

    纯代码方式

        //数据源配置
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setUrl("jdbc:mysql://127.0.0.1/db_student?serverTimezone=UTC");
            dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); //这个可以缺省的,会根据url自动识别
            dataSource.setUsername("root");
            dataSource.setPassword("abcd");
            
            //下面都是可选的配置
            dataSource.setInitialSize(10);  //初始连接数,默认0
            dataSource.setMaxActive(30);  //最大连接数,默认8
            dataSource.setMinIdle(10);  //最小闲置数
            dataSource.setMaxWait(2000);  //获取连接的最大等待时间,单位毫秒
            dataSource.setPoolPreparedStatements(true); //缓存PreparedStatement,默认false
            dataSource.setMaxOpenPreparedStatements(20); //缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句代码
    
            //获取连接
            Connection connection = dataSource.getConnection();
    
            //Statement接口
            Statement statement = connection.createStatement();
            String sql1 = "insert into tb_student (name,age) values ('chy',20)";
            statement.executeUpdate(sql1);
    
            //PreparedStatement接口
            String sql2 = "insert into tb_student (name,age) values ('chy',21)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.execute();
    
            //关闭连接
            connection.close();

     

    配置文件方式

    1、在sources下新建druid.properties

    url=jdbc:mysql://127.0.0.1/db_student?serverTimezone=UTC
    #这个可以缺省的,会根据url自动识别
    driverClassName=com.mysql.cj.jdbc.Driver
    username=root
    password=abcd
    
    ##初始连接数,默认0
    initialSize=10
    #最大连接数,默认8
    maxActive=30
    #最小闲置数
    minIdle=10
    #获取连接的最大等待时间,单位毫秒
    maxWait=2000
    #缓存PreparedStatement,默认false
    poolPreparedStatements=true
    #缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句设置
    maxOpenPreparedStatements=20

    2、使用

    public class Test {
        
        public static void main(String[] args) throws Exception {
            //数据源配置
            Properties properties=new Properties();
            //通过当前类的class对象获取资源文件
            InputStream is = Test.class.getResourceAsStream("/druid.properties"); 
            properties.load(is);
            //返回的是DataSource,不是DruidDataSource
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    
            //获取连接
            Connection connection = dataSource.getConnection();
    
            //Statement接口
            Statement statement = connection.createStatement();
            String sql1 = "insert into tb_student (name,age) values ('chy',20)";
            statement.executeUpdate(sql1);
    
            //PreparedStatement接口
            String sql2 = "insert into tb_student (name,age) values ('chy',22)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.execute();
    
            //关闭连接
            connection.close();
        }
        
    }

    这种方式对properties的key有严格要求,必须值指定的字符串,容易写错。

    如果觉得老调不好,可以DruidDataSource dataSource = new DruidDataSource();  再调用setter方法使用配置文件的值,不过很麻烦。

    在Spring中使用Druid

    1、resources下新建druid.properties

    druid.url=jdbc:mysql://127.0.0.1/db_student?serverTimezone=UTC
    #这个可以缺省的,会根据url自动识别
    druid.driverClassName=com.mysql.cj.jdbc.Driver
    druid.username=root
    druid.password=abcd
    
    ##初始连接数,默认0
    druid.initialSize=10
    #最大连接数,默认8
    druid.maxActive=30
    #最小闲置数
    druid.minIdle=10
    #获取连接的最大等待时间,单位毫秒
    druid.maxWait=2000
    #缓存PreparedStatement,默认false
    druid.poolPreparedStatements=true
    #缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句设置
    druid.maxOpenPreparedStatements=20

    2、spring配置文件

        <!--引入druid配置文件-->
        <context:property-placeholder location="classpath:druid.properties" />
    
        <!--druid连接池-->
        <bean name="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="url" value="${druid.url}" />
            <property name="driverClassName" value="${druid.driverClassName}" />
            <property name="username" value="${druid.username}" />
            <property name="password" value="${druid.password}" />
            <property name="initialSize" value="${druid.initialSize}"/>
            <property name="maxActive" value="${druid.maxActive}" />
            <property name="minIdle" value="${druid.minIdle}" />
            <property name="maxWait" value="${druid.maxWait}" />
            <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />
            <property name="maxOpenPreparedStatements" value="${druid.maxOpenPreparedStatements}" />
        </bean>

    注意要配置包扫描,扫描注解。

    3、使用

    @Repository
    public class Xxx {
        @Resource
        private DruidDataSource dataSource;
    
        public void xxx() throws SQLException {
            //获取连接
            Connection connection = dataSource.getConnection();
    
            //Statement接口
            Statement statement = connection.createStatement();
            String sql1 = "insert into tb_student (name,age) values ('chy',20)";
            statement.executeUpdate(sql1);
    
            //PreparedStatement接口
            String sql2 = "insert into tb_student (name,age) values ('chy',22)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.execute();
    
            //关闭连接
            connection.close();
        }
    }

    在SpringBoot中使用Druid

    SpringBoot默认提供了DBCP连接池的配置,只需要在配置文件中配置即可。

    C3P0、Druid没有提供配置,需要我们在配置文件中添加配置,并自己写一个配置类来创建连接池。

    参考我的另一篇随笔:https://www.cnblogs.com/chy18883701161/p/12685833.html

     

    使用durid的监控功能

    1、在druid数据源里启用stat过滤器

    <property name="filters" value="stat" />

    2、在web.xml中配置StatViewServlet

      <servlet>
            <servlet-name>DruidStatView</servlet-name>
            <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
            <!--&lt;!&ndash; 是否允许清空统计数据,不写时默认true &ndash;&gt;-->
            <!--<init-param>-->
            <!--    <param-name>resetEnable</param-name>-->
            <!--    <param-value>false</param-value>-->
            <!--</init-param>-->
            <!--&lt;!&ndash; 用户名。用户名和密码可以不配置,不配置时进入监控页面时不需要输入用户名、密码 &ndash;&gt;-->
            <!--<init-param>-->
            <!--    <param-name>loginUsername</param-name>-->
            <!--    <param-value>chy</param-value>-->
            <!--</init-param>-->
            <!--&lt;!&ndash; 密码 &ndash;&gt;-->
            <!--<init-param>-->
            <!--    <param-name>loginPassword</param-name>-->
            <!--    <param-value>abcd</param-value>-->
            <!-- </init-param>-->
        </servlet>
    
        <servlet-mapping>
            <servlet-name>DruidStatView</servlet-name>
            <url-pattern>/druid/*</url-pattern>
        </servlet-mapping>

    启动web应用,在  localhost:8080/druid  可看到sql的执行情况统计。(注意不是项目下)

    druid默认会清空统计数据,所以只能看到当时的情况,应用需要持续操作数据库才好看到效果。

  • 相关阅读:
    无限级分类表设计
    多表连接
    连接(上接子查询那一篇随笔)
    数据库中常用指令
    子查询
    mysql查询表达式解析
    mysql单表删除记录DELETE
    mysql 单表更新记录UPDATE
    七言
    时分秒计算案例
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12594889.html
Copyright © 2020-2023  润新知