Spring基础课八:集成数据库连接池Druid

守給你的承諾、 提交于 2020-02-02 08:15:42

数据库连接池Druid

  1. 数据库连接池负责建立,管理和释放数据库连接,允许应用重用已建立的数据库连接,而不是重新建立一个;

  2. Druid的使用,首先新建一个DruidDataSource的bean,构造设置连接池参数,这样每次调用getConnection()方法,即是从连接池中获取连接,而非每次都新建立数据库连接。结合jdbcTemplate,只需将其作为jdbcTemplate的构造参数传入即可;

  3. Druid连接池参数,

	initialSize,minIdle,maxActive :连接池的初始化连接数,最小空闲连接数,最大连接数
	maxWait:获取连接的最大等待超时时间
	timeBetweenEvictionRunsMillis:检测并关闭空闲连接的间隔时间
	minEvictableIdleTimeMillis:数据库连接在连接池中的最小生存时间
	filters:配置用于监控的拦截器,常用的有stat,wall等
  1. Filters介绍,wallFilter会拦截sql进行检测,防止sql注入,并会读取META-INF/druid/wall/myql目录下的配置文件来进行过滤,如设置不允许delete等操作,默认会对认为攻击的sql抛出SQLException;StatFilter用于慢Sql统计,通过属性druid.stat.slowSqlMillis设置临界时间;还可以自定义扩展Filter,拦截JDBC方法加入自定义逻辑;

  2. Druid的sql执行日志,通过应用中的日志组件拦截druid.sql包的日志即可;

  3. sql监控信息展示,通过spring.datasource.druid.statViewServlet=StatViewServlet配置,便可以在/projectName/druid/index.html的页面访问,web-jdbc监控信息的展示,通过spring.datasource.druid.webStatFilter=WebStatFilter配置,Spring容器的监控信息,通过DruidStatInterceptor配置,这样sql,web,spring监控信息均可通过druid/index.html页面展示了,并且可以设置ip限制;

  4. Druid还提供了若干工具类,SQLUtils:格式化sql,如添加查询参数,SQLUtils.addCondition(…);PageUtils:分页工具类,如添加分页,PagerUtils.limit(sql, JdbcConstants.ORACLE,20,10);

  5. 更多配置参数查看:https://github.com/alibaba/druid/wiki,https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter;

常见问题排除

  1. 连接池泄漏:当应用配置了webStatFilter之后,在内置监控页面weburi-detail.html中,查看JdbcPoolConnectionOpenCount和JdbcPoolConnectionCloseCount属性,如果不相等,就是泄漏了;

  2. 往数据库插入中文数据时有乱码出现:在数据库URL后面添加?useUnicode=true&characterEncoding=UTF-8;

  3. 数据库主键用自增的id好,还是string好:自增id好,维护主键消耗小;

  4. HashMap中的key和JdbcTemplate获取的Map的key区分大小写吗:HashMap区分,JdbcTemplate获取的Map是不区分的;

  5. 存储过程使用示例:

	CallableStatement:存储过程接口
    // mysql中创建存储过程
    // 第一句话表示用//作为分隔符
    delimiter //
    create procedure add_pro(a int, b int, out sum int)
    begin
    set sum = a + b;
    end;
    //
    CallableStatement callStat = con.prepareCall("{call add_pro(?,?,?)}");
    callS.setInt(1);callS.setInt(2);callS.registerOutParameter(3,Types.INTEGER);
    callS.execute();
    // 得到输出
    Integer out = callS.getInt(3); 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!