精华内容
下载资源
问答
  • 数据库连接池配置
    2021-02-18 14:23:37

    数据库连接池配置

    连接池的必要性
    数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,可以视作一个存放数据库连接的容器。

    数据库连接池采用了资源池设计模式,用于资源共享,避免资源的频繁分配与释放问题。同时便于统一管理,可以通过对连接池的控制,限制系统与数据库的连接,监视数据库的连接数量和使用情况。
    1、不使用连接池流程#
    下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程。

    TCP建立连接的三次握手
    MySQL认证的三次握手
    真正的SQL执行
    MySQL的关闭
    TCP的四次挥手关闭
    为了执行一条SQL,却多了非常多网络交互。
    优点:实现简单
    缺点:

    网络IO较多
    数据库的负载较高
    响应时间较长及QPS较低
    应用频繁的创建连接和关闭连接,导致临时对象较多,GC频繁
    在关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)
    2、使用连接池流程#
    使用数据库连接池的步骤:

    第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。
    优点:

    较少了网络开销
    系统的性能会有一个实质的提升
    没了麻烦的TIME_WAIT状态
    数据库连接数设置#
    系统可采取设置最小连接数和最大连接数等参数来控制连接池中的连接。最小连接数是系统启动时创建的数据库连接数。最小连接数小,则启动快,响应慢。通常设置较大一些。最小连接数可以设置为5个-10个。最大连接数根据硬件配置设置,4核心机器可以设为10个,8核心可以设为20个。

    HikariCP的默认的最大和最小连接数是10。作者建议是设置最大和最小连接数为相同的值,维护一个高性能连接池。

    为什么连接池数并不是越大越好?#
    第一点,首先我们要知道单核CPU“同时”运行多个线程,只不过是假象。单核CPU同一时刻只能执行一个线程,然后操作系统切换上下文,CPU 核心快速调度,执行另一个线程的代码。这其中便涉及到了大量上下文切换带来的额外性能损耗。

    第二点,由上可知,一个N核心服务器,设置数据库连接数为N便能提供最优性能。然而,实际情况会受到磁盘IO和网络IO的影响,在IO等待时间内,线程阻塞等待,CPU处于空闲状态。因此,在线程处理I/O密集业务操作时,需要设置线程/连接数比CPU大一些,以提高吞吐量。

    连接数的计算公式

    连接数 = ((核心数 * 2) + 有效磁盘数)
    服务器 CPU 是 4核 i7 的,连接池大小应该为 ((4 * 2) + 1) = 9 ~ 10个。具体需要根据实际业务场景做调整。

    业务场景

    对于并发访问,可以采用小的数据库连接池,然后将剩下的业务线程放在队列中等待。
    如果系统中混合了长事务和短事务,正确的做法应该是创建两个连接池,一个服务于长事务,一个服务于"实时"查询,也就是短事务。

    更多相关内容
  • druid数据库连接池配置

    千次阅读 2021-12-20 13:07:40
    druid数据库连接池配置

    在Maven依赖中加入druid和mysql-connector-java依赖

    在同src目录下的druid.properties文件进行相关的配置。

    url=jdbc:mysql://localhost:3306/xxx
    username=root
    password=123456
    driverClassName=com.mysql.jdbc.Driver
    
    initialSize=10//初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
    maxActive=20//最大连接池数量
    maxWait=1000//获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
    filters=wall
    
     //使用Druid连接池
        private static DataSource source=null;
        static {
            try {
                Properties prop=new Properties();
                InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
                prop.load(is);
                //加载驱动
                source = DruidDataSourceFactory.createDataSource(prop);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static Connection getConnectionDruid() throws Exception {
    
            //获取连接
            Connection connection = source.getConnection();
            return connection;
        }
    
    通过应该配置类的方式
    
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    import java.sql.SQLException;
    
    
    /**
     * @ClassName: DruidConfiguration
     * @Description:Druid监控配置类
     * @author  df.l
     * @date 2021年11月04日
     * @Copyright boulderai8tech.com
     */
    @Configuration
    public class DruidConfiguration {
      private static final Logger LOGGER = LoggerFactory.getLogger(DruidConfiguration.class);
    
      @Value("${spring.datasource.url}")
      private String dbUrl;
    
      @Value("${spring.datasource.username}")
      private String username;
    
      @Value("${spring.datasource.password}")
      private String password;
    
      @Value("${spring.datasource.driverClassName}")
      private String driverClassName;
    
      @Value("${spring.datasource.initialSize}")
      private int initialSize;
    
      @Value("${spring.datasource.minIdle}")
      private int minIdle;
    
      @Value("${spring.datasource.maxActive}")
      private int maxActive;
    
      @Value("${spring.datasource.maxWait}")
      private int maxWait;
    
      @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
      private int timeBetweenEvictionRunsMillis;
    
      @Value("${spring.datasource.minEvictableIdleTimeMillis}")
      private int minEvictableIdleTimeMillis;
    
      @Value("${spring.datasource.validationQuery}")
      private String validationQuery;
    
      @Value("${spring.datasource.testWhileIdle}")
      private boolean testWhileIdle;
    
      @Value("${spring.datasource.testOnBorrow}")
      private boolean testOnBorrow;
    
      @Value("${spring.datasource.testOnReturn}")
      private boolean testOnReturn;
    
      @Value("${spring.datasource.poolPreparedStatements}")
      private boolean poolPreparedStatements;
    
      @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
      private int maxPoolPreparedStatementPerConnectionSize;
    
      @Value("${spring.datasource.filters}")
      private String filters;
    
      @Value("{spring.datasource.connectionProperties}")
      private String connectionProperties;
    
      @Bean(name = "dataSource")
      public DataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
    
        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
    
        //configuration
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        try {
          datasource.setFilters(filters);
        } catch (SQLException e) {
          LOGGER.error("druid configuration initialization filter", e);
        }
        datasource.setConnectionProperties(connectionProperties);
        return datasource;
      }
    
    }
    
    

    后加

    springboot+druid数据库连接池配置

    <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid-spring-boot-starter</artifactId>
         <version>1.1.20</version>
    </dependency>
    

    在application.yml项目配置文件中加入druid的数据库连接池配置

    spring:
      datasource:
        #类型
        type: com.alibaba.druid.pool.DruidDataSource
        #驱动
        driverClassName: com.mysql.jdbc.Driver
        driver-class-name: com.mysql.jdbc.Driver
        platform: mysql
        #数据库连接
        url: jdbc:mysql://xxx.xx.xxx.xxx:3306/MYDATA?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
        #数据库用户名密码
        username: xxxxx
        password: xxxxxxxx
        #连接池配置
        druid:
          #初始化连接池大小
          initialSize: 10
          #最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止
          minIdle: 1
          #最大活跃数
          maxActive: 50
          #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
          maxWait: 60000
          #失效检查线程运行时间间隔,要小于MySQL默认
          timeBetweenEvictionRunsMillis: 60000
          #连接的超时时间,默认为半小时
          minEvictableIdleTimeMillis: 300000
          #检查连接有效性的SQL语句
          validationQuery: SELECT 1 FROM dual
          #检查连接是否有效
          testWhileIdle: true
          testOnBorrow: true
          testOnReturn: false
          #开启池的prepared statement 池功能
          poolPreparedStatements: false
          #statement池能够同时分配的打开的statements的最大数量
          maxOpenPreparedStatements: 50
          #开启StatFilter
          filter:
            stat:
              enabled: true
              log-slow-sql: true
              slow-sql-millis: 1000
            #开启Slf4jFilter,使用logback时注释
            #slf4j:
              #enabled: true
              #data-source-log-enabled: false
              #connection-log-enabled: false
              #statement-log-enabled: false
              #result-set-log-enabled: false
            #开启WallFilter
            wall:
              enabled: true
              log-violation: true
              throw-exception: false
              config:
                delete-where-none-check: true
          #开启Web监控
          web-stat-filter:
            enabled: true
            exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
            url-pattern: /*
          #开启监控页面
          stat-view-servlet:
            enabled: true
            login-username: admin
            login-password: admin123
    
    

    启动项目,打开http://127.0.0.1:8080/druid页面即可看到druid的监控页面。ip和端口就是项目的ip和端口

    需要自己为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成了;我们需要 自己添加 DruidDataSource 组件到容器中,并绑定属性

    @Configuration
    public class DruidConfig {
    
        @ConfigurationProperties(prefix = "spring.datasource")
        @Bean
        public DataSource druid(){
           return  new DruidDataSource();
        }
    
       
    }
    

    使用

    @SpringBootTest
    class SpringbootDataJdbcApplicationTests {
    
        //DI注入数据源
        @Autowired
        DataSource dataSource;
    
        @Test
        public void contextLoads() throws SQLException {
            //看一下默认数据源
            System.out.println(dataSource.getClass());
            //获得连接
            Connection connection =   dataSource.getConnection();
            System.out.println(connection);
    
            DruidDataSource druidDataSource = (DruidDataSource) dataSource;
            System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());
            System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());
    
            //关闭连接
            connection.close();
        }
    }
    
    

    druid连接池配置的主要参数说明
    name : 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:“DataSource-” + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。

    url:连接数据库的url,不同数据库不一样。例如:

    mysql : jdbc:mysql://x.x.xxx.xxx:3306/database

    oracle : jdbc:oracle:thin:@xx.xx.xx.xx:1521:database

    username:连接数据库的用户名

    password:连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter

    driverClassName: 缺省值-根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName

    initialSize: 缺省值-0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时

    maxActive: 缺省值- 8 最大连接池数量

    maxIdle: 缺省值- 8 已经不再使用,配置了也没有效果的

    minIdle: 最小连接池数量

    maxWait:获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。

    poolPreparedStatements: 缺省值-false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。

    maxPoolPreparedStatementPerConnectionSize: 缺省值- -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

    validationQuery:用来检测连接是否有效的sql,要求是一个查询语句,常用select ‘x’。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用

    validationQueryTimeout:单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法

    testOnBorrow: 缺省值-true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

    testOnReturn: 缺省值-false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

    testWhileIdle:缺省值-false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

    keepAlive:缺省值-false(1.0.28版本)连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。

    timeBetweenEvictionRunsMillis: 缺省值- 1分钟(1.0.14) 有两个含义:

    Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。

    testWhileIdle的判断依据,详细看testWhileIdle属性的说明

    numTestsPerEvictionRun:缺省值- 30分钟 不再使用,一个DruidDataSource只支持一个EvictionRun

    minEvictableIdleTimeMillis: 连接保持空闲而不被驱逐的最小时间

    connectionInitSqls: 物理连接初始化的时候执行的sql

    exceptionSorter:缺省值-根据dbtype自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接

    filters: 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:

    监控统计用的filter:stat

    日志用的filter:log4j

    防御sql注入的filter:wall

    proxyFilters:类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

    展开全文
  • 主要介绍了Java数据库连接池的几种配置方法(以MySQL数据库为例) 的相关资料,需要的朋友可以参考下
  • context.xml, 数据库连接池配置
  • springboot+druid数据库连接池配置

    千次阅读 2020-08-07 13:48:38
    springboot+druid数据库连接池配置 引入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</...

    springboot+druid数据库连接池配置

    引入依赖

    <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid-spring-boot-starter</artifactId>
         <version>1.1.20</version>
    </dependency>
    

    在application.yml项目配置文件中加入druid的数据库连接池配置

    spring:
      datasource:
        #类型
        type: com.alibaba.druid.pool.DruidDataSource
        #驱动
        driverClassName: com.mysql.jdbc.Driver
        driver-class-name: com.mysql.jdbc.Driver
        platform: mysql
        #数据库连接
        url: jdbc:mysql://xxx.xx.xxx.xxx:3306/MYDATA?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
        #数据库用户名密码
        username: xxxxx
        password: xxxxxxxx
        #连接池配置
        druid:
          #初始化连接池大小
          initialSize: 10
          #最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止
          minIdle: 1
          #最大活跃数
          maxActive: 50
          #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
          maxWait: 60000
          #失效检查线程运行时间间隔,要小于MySQL默认
          timeBetweenEvictionRunsMillis: 60000
          #连接的超时时间,默认为半小时
          minEvictableIdleTimeMillis: 300000
          #检查连接有效性的SQL语句
          validationQuery: SELECT 1 FROM dual
          #检查连接是否有效
          testWhileIdle: true
          testOnBorrow: true
          testOnReturn: false
          #开启池的prepared statement 池功能
          poolPreparedStatements: false
          #statement池能够同时分配的打开的statements的最大数量
          maxOpenPreparedStatements: 50
          #开启StatFilter
          filter:
            stat:
              enabled: true
              log-slow-sql: true
              slow-sql-millis: 1000
            #开启Slf4jFilter,使用logback时注释
            #slf4j:
              #enabled: true
              #data-source-log-enabled: false
              #connection-log-enabled: false
              #statement-log-enabled: false
              #result-set-log-enabled: false
            #开启WallFilter
            wall:
              enabled: true
              log-violation: true
              throw-exception: false
              config:
                delete-where-none-check: true
          #开启Web监控
          web-stat-filter:
            enabled: true
            exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
            url-pattern: /*
          #开启监控页面
          stat-view-servlet:
            enabled: true
            login-username: admin
            login-password: admin123
    

    然后启动项目,打开http://127.0.0.1:8080/druid页面即可看到druid的监控页面。这里的ip和端口就是项目的ip和端口。
    在这里插入图片描述

    druid连接池配置的主要参数说明

    name : 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:“DataSource-” + System.identityHashCode(this). 另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错。

    url:连接数据库的url,不同数据库不一样。例如:

    mysql : jdbc:mysql://x.x.xxx.xxx:3306/database

    oracle : jdbc:oracle:thin:@xx.xx.xx.xx:1521:database

    username:连接数据库的用户名

    password:连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter

    driverClassName: 缺省值-根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName

    initialSize: 缺省值-0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时

    maxActive: 缺省值- 8 最大连接池数量

    maxIdle: 缺省值- 8 已经不再使用,配置了也没有效果的

    minIdle: 最小连接池数量

    maxWait:获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。

    poolPreparedStatements: 缺省值-false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。

    maxPoolPreparedStatementPerConnectionSize: 缺省值- -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

    validationQuery:用来检测连接是否有效的sql,要求是一个查询语句,常用select ‘x’。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用

    validationQueryTimeout:单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法

    testOnBorrow: 缺省值-true 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

    testOnReturn: 缺省值-false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

    testWhileIdle:缺省值-false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

    keepAlive:缺省值-false(1.0.28版本)连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。

    timeBetweenEvictionRunsMillis: 缺省值- 1分钟(1.0.14) 有两个含义:

    1. Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。

    2. testWhileIdle的判断依据,详细看testWhileIdle属性的说明

    numTestsPerEvictionRun:缺省值- 30分钟 不再使用,一个DruidDataSource只支持一个EvictionRun

    minEvictableIdleTimeMillis: 连接保持空闲而不被驱逐的最小时间

    connectionInitSqls: 物理连接初始化的时候执行的sql

    exceptionSorter:缺省值-根据dbtype自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接

    filters: 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:

    监控统计用的filter:stat

    日志用的filter:log4j

    防御sql注入的filter:wall

    proxyFilters:类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

    展开全文
  • 阿里巴巴旗下开源产品,目前最好的数据库连接池详细配置极其所有属性。
  • 里面包含了tomcat容器配置连接池时,需要用到的数据库驱动
  • 【mysql调优】数据库连接池配置优化

    千次阅读 2020-03-27 23:02:23
    在性能调优过程中,通过监控数据经常发现接口花费大量时间在获取数据库连接中,那如何通过优化数据库连接池配置来优化服务的性能呢? 什么是数据库连接池 创建数据库连接是一个很耗时的操作,也容易对数据库造成...

    在性能调优过程中,通过监控数据经常发现接口花费大量时间在获取数据库连接中,那如何通过优化数据库连接池的配置来优化服务的性能呢?

    什么是数据库连接池

    创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠

    官方解释:
    数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

    为什么需要连接池

    任何数据库的访问都需要首先建立数据库连接。这是一个复杂、缓慢的处理。牵涉到通信建立(包括 TCP 的三次握手)、认证、授权、资源的初始化和分配等一系列任务
    在应用启动时预先建立一些数据库连接,应用程序使用已有的连接可以极大提高响应速度。另外,Web 服务应用当客户很多时,有很多线程,连接数目过多以及频繁创建/删除连接也会影响数据库的性能

    连接池带来的好处:

    • 节省了创建数据库连接的时间,通常这个时间大大超过处理数据访问请求的时间
    • 统一管理数据库请求连接,避免了过多连接或频繁创建/删除连接带来的性能问题
    • 监控数据库连接的运行状态和错误报告,减少应用服务的这部分代码

    实现原理

    在应用开始时创建一组数据库的连接,也可以动态创建但是复用已有的连接。这些连接被存储到一个共享的资源数据结构,称为连接池(典型的生产者-消费者并发模型)

    连接逻辑
    每个线程在需要访问数据库时借用(borrow)一个连接,使用完成则释放(release)连接回到连接池供其他线程使用
    比较好的线程池构件会有二个参数动态控制线程池的大小:最小数量和最大数量

    最小数量指即使负载很轻,也保持一个最小数目的数据库连接以备不时之需
    当同时访问数据库的线程数超过最小数量时,则动态创建更多连接。最大数量则是允许的最大数据库连接数量,当最大数目的连接都在使用而有新的线程需要访问数据库时,则新的线程会被阻塞直到有连接被释放回连接池
    当负载变低,池里的连接数目超过最小数目而只有低于或等于最小数目的连接被使用时,超过最小数目的连接会被关闭和删除以便节省系统资源。

    连接泄露
    连接池的实际应用中,最担心的问题就是借了不还的这种让其他人无资源可用的人品问题
    编码逻辑错误或者释放连接放代码没有放到 finally 部分都会导致连接池资源枯竭从而造成系统变慢甚至完全阻塞的情况。类似于内存泄露,因而也叫连接泄露

    连接池系统架构

    连接池只是给业务应用提供已建立的连接,所有的访问请求都通过连接转发到后台数据库服务器
    具体来说,连接池是两个线程池的中间通道。可以看成下面的结构:
    在这里插入图片描述
    上图中,连接池和应用服务线线程池在同一个进程里面。每个访问数据库的应用服务进程都有自己的线程池和对应的数据库连接池。数据库服务器可能需要处理来自一个或多个服务器的多个应用服务进程内的数据库连接池数据访问请求

    连接池的运行机制

    1. 程序初始化时创建连接池
    2. 使用时向连接池申请可用连接
    3. 使用完毕,将连接返还给连接池
    4. 程序退出时,断开所有连接,并释放资源

    配置考虑因素

    • 当前连接DB的规模
    • 并发情况
    • 执行db的响应时间

    做为应用服务和数据库的桥梁,连接池参数配置的目标是全局优化。具体的优化目的有四个:

    1. 尽可能满足应用服务的并发数据库访问
    2. 不让数据库服务器过载
    3. 能发现用了不还造成的死锁
    4. 不浪费系统资源

    不浪费系统资源是指配置过大的连接池会浪费应用服务器的系统资源,包括内存,网络端口,同步信号等。同时线程池的重启和操作都会响应变慢。不过应用端连接池的开销不是很大,资源的浪费通常不是太大问题

    配置参数解读

    1. 初始化连接:可考虑设置为3个连接 。对于db规模特别大的情况下可考虑设置为1个。避免启动时间过长
    2. 最小连接:可考虑该值的设置和初始化连接保持一致
    3. 最大连接:对于有较大DB规模,最大连接不要设置过大,避免本地维护的db太大。如果对应到数据源的并发数过高,可考虑增大最大连接数
    4. 获取连接的超时时间:如果连接全部被占用,需要等待的时间。可以根据当前系统的响应时间判定,如果容忍度较高,可以大点。容忍度较低,设置小点
    5. 获取连接和释放连接心跳检测:建议全部关闭,否则每个数据库访问指令会对数据库生产额外的两条心跳检测的指令,增加数据库的负载。连接有效性的检查改用后台空闲连接检查
    6. 连接有效性检测时间:该值需要结合数据库的wait_timeout,interactive_timeout值进行设置。假如数据库为120s,则心跳检测时间在120s以内越大越好。如果太小,心跳检测时间会比较频繁。建议设置为90s
    7. 最大空闲时间:如果连接超过该时间没有使用过,则会进行close掉。 该值不要太小,避免频繁的建立连接关闭连接。也不要太大,导致一直无法关闭
    8. 心跳检查的sql语句:尽量使用ping命令,ping的性能较查询语句高。大部分的数据库连接池不配置query语句,便会调用ping命令。
    9. prepareStatement缓存:可以根据自己的业务来判定是否开启。开启后对性能的影响依赖于具体业务和并发情况。可考虑暂时不开启
    10. 连接使用超时:业务拿到一个连接,如果超过指定的时间未归还,是否把该连接给给回收掉。超时时间等和具体的业务关联。暂时建议先不开启

    如何配置数据库连接池

    druid配置
    介绍:https://github.com/alibaba/druid
    在这里插入图片描述
    配置说明:

    1. minEvictableIdleTimeMillis(最大空闲时间):默认为30分钟,配置里面不进行设置
    2. testOnBorrow ,testOnReturn 默认为关闭,可以设置为不配置
    3. testWhileIdle(在获取连接后,确定是否要进行连接空闲时间的检查)。默认为true。配置里面不再进行设置

    流程说明:

    1. 在第一次调用connection的时候,才会进行 initialSize的初始化
    2. 心跳检测时间线程,会休眠timeBetweenEvictionRunsMillis时间,然后只对(没有borrow的线程 减去 minIdle)的线程进行检查,如果空闲时间大于minEvictableIdleTimeMillis则进行close
    3. testWhileIdle必须设置为true,在获取到连接后,先检查testOnBorrow,然后再判定testwhileIdle,如果连接空闲时间大于timeBetweenEvictionRunsMillis,则会进行心跳检测
    4. 不需要配置validationQuery,如果不配置的情况下会走ping命令,性能更高
    5. 连接保存在数组里面,获取连接的时候,获取数组的最后一位。在timeBetweenEvictionRunsMillis时是从前往后进行检查连接的有效性
    展开全文
  • Weblogic数据库连接池配置图解

    千次阅读 2018-12-04 10:35:06
    1、建立连接池 2、填写连接属性 3、测试连接配置 ...5、在connections面板上进行高级测试属性的配置 ...7、到datasources处配置数据源...9、选择数据库源放置与那个连接池 10、选择目标服务器 11、配置成...
  • SpringCloud - Driud数据库连接池配置

    千次阅读 2020-10-19 19:11:51
    数据库连接池配置: 启动文件: @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) yml 配置文件配置: 配置文件配置: spring: application: name: templeName datasource: # 配置...
  • java解决高并发之数据库连接池配置

    千次阅读 2019-03-19 02:34:46
    对于频繁修改数据的这种情况,例如:用户要抢商品,且抢完后要刷新看自己抢的商品,这会造成频繁的修改数据库和查询数据库,所以对于用数据库读写分离来说并不高效,因为这涉及到频繁的查询和修改数据库...
  • mybatis数据库连接池配置

    千次阅读 2021-01-19 09:23:06
    mybatis学习笔记之学习目录(1)mybatis学习笔记之学习结构(1)学习结构:1.mybatis开发方法原始dao开发方法(程序需要编写dao接口和dao实现类)mybatis的mapper接口(相当于dao接口)代理开发方法mybatis配置文件...
  • 数据库连接池配置pom依赖记录

    千次阅读 2020-06-28 12:08:50
    Druid连接池 Driver驱动 <!--数据库相关--> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>...
  • JAVA 使用数据库连接池连接Oracle数据库,全代码,附加详细说明
  • Tomcat数据库连接池配置

    万次阅读 多人点赞 2016-04-04 10:09:45
    Tomcat数据库连接池配置,本来是一件很简单的事情,网上也有不少的文章,但是大多只有文字描述,没有图向导,对于初学者来说,信息量太大,很容易搞不清楚哪里是哪里,于是在绕过无数弯踩过深坑之后,本小白决定为...
  • Hikari 数据库连接池配置详解

    千次阅读 2019-04-17 16:41:05
    连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置 null HikariPool-1 - initializationFailTimeout 如果池无法成功初始化连接,则此属性控制池是否将  fail ...
  • springboot数据库连接池配置

    千次阅读 2022-04-02 11:17:29
    ############################### DRUID数据源配置 start ################################ spring: datasource: driver-class-name: org.postgresql.Driver druid: filter: slf4j: enabled: true stat: ...
  • 三种数据库连接池配置

    千次阅读 2021-01-18 22:17:29
    三种数据库连接池配置及使用(For JDBC)连接池的优缺点优点使用连接池的最主要的优点是性能。创建一个新的数据库连接所耗费的时间主要取决于网络的速度以及应用程序和数据库服务器的(网络)距离,而且这个过程通常是...
  • proxool数据库连接池配置.doc
  • 数据库连接池配置引发的危机 车祸现场: xxx系统由于业务需求,所要部署的定时任务变的越来越多,于是决定利用Quartz框架来做一个任务调度管理模块(采用集群模式,并持久化任务调度信息,数据保存于mysql5.6)。 ...
  • springboot配置数据库连接池

    千次阅读 2022-04-27 07:41:01
    一、传统java配置 java配置主要靠java类和一些注解,比较常用的注解有: @Configuration:声明一...1.首先引入Druid连接池依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId&g
  • Tomcat5的数据库连接池配置Tomcat5的数据库连接池配置Tomcat5的数据库连接池配置Tomcat5的数据库连接池配置Tomcat5的数据库连接池配置Tomcat5的数据库连接池配置Tomcat5的数据库连接池配置Tomcat5的数据库连接池配置...
  • orcal数据库连接池配置信息 可以直接复制到tomcat 配置文件下使用
  • SpringBoot数据库连接池常用配置

    千次阅读 2022-04-12 17:18:16
    配置文件中添加配置如下(我使用的是多数据源): spring.datasource.primary.url=jdbc\:mysql\://localhost\:3306/test?useUnicode\=true&characterEncoding\=utf-8 spring.datasource.primary.username=...
  • 数据库连接池jar包-c3p0和druid,包含各自的配置文件,需要的小伙伴自行下载即可!
  • python 通过数据库连接池访问数据库工具,支持可配置数据连接池大小,并发连接数配置
  • jfinal druid数据库连接池配置

    千次阅读 2017-11-02 17:59:51
    在jfinal配置类的configPlugin(Plugins me)中配置插件 ... * 1,druid数据库连接池 * 2,配置ActiveRecord插件 * 3,所有配置在 MappingKit 中搞定 * 4,缓存插件 * @param me */ @Override public v
  • springboot项目配置数据库连接池Druid

    千次阅读 2022-01-15 00:11:03
    com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/xxx?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 username: root password: root druid: initial-size: 5 #连接池初始化大小...enabled: true # 新版默认值是 false, 需要手动打开 login-username: root login-password: 123456 reset-enable: true allow: "" # 允许所有ip访问 DruidConfig @Configuration public class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 278,830
精华内容 111,532
关键字:

数据库连接池配置

友情链接: 0883814.rar