数据库杂记

1. ConfigFilter的作用包括:

    从配置文件中读取配置

    从远程http文件中读取配置

    为数据库密码提供加密功能

    参见:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter

2. DruidDataSource配置属性列表配置,详见:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8

    1)maxActive 最大连接池数量;maxIdle 已经不再使用,配置了也没效果。

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

    3)testOnBorrow 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

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

    5)poolPreparedStatements 这个是设置有争议。

          a. DruidDataSource配置属性列表配置 给出的建议:是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。

          b. infoQ中  浅析MySQL JDBC连接配置上的两个误区   文章给出的建议,新版本建议设置为 true。数据库连接池是否需要配置 poolPreparedStatements 为true: 新版本建议打开

              参见:http://www.infoq.com/cn/news/2017/03/Analysis-errors-MySQL-JDBC

3. mysql主从复制

    1)master在执行sql之后,记录二进制log文件(bin-log)。

    2)slave连接master,并从master获取binlog,存于本地relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。

    从以上mysql的Replication原理可以看出:

    * 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。

    * 如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。

    * 如果对从库进行修改数据,那么如果此时从库正在在执行主库的bin-log时,则会出现错误而停止同步,这个是很危险的操作。所以一般情况下,我们要非常小心的修改从库上的数据。

    * 一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。

    * 如果需要多主库的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。

4. MySQL 一表中字段内容是用逗号分隔的 另一表含有对应数据的两表联合查询

    举例:select staff.id,staff.leaderid,GROUP_CONCAT(leader.name) as '领导姓名'   from staff JOIN leader   ON FIND_IN_SET(leader.id,staff.leaderid)  GROUP BY staff.id  

    参见:https://blog.csdn.net/knight_quan/article/details/51767827

5. 查询数据库中所有表名:select table_name from information_schema.tables where table_schema='csdb' and table_type='base table';

    查询指定数据库中指定表的所有字段名column_name:select column_name from information_schema.columns where table_schema='csdb' and table_name='users'

6. mybatis中使用union all    

<select id="getProductEnableNumberInfos" resultMap="productMap" >
          SELECT CDSK_ITEM_CODE ProductCode,WMST_SKU_UNIT ProductUnit,WMST_ENABLED_NUMBER ProductNum from (
              <foreach collection="conditions.list" item="item" index="index" separator="union all">
                SELECT c.CDSK_ITEM_CODE,WMST_SKU_UNIT,SUM(WMST_ENABLED_NUMBER) WMST_ENABLED_NUMBER FROM wm_stock_${conditions.esCorCode} w 
                LEFT JOIN cd_wh_itme_${conditions.esCorCode} c ON w.WMST_SKU_ID=c.CD_ITEM_ID
                WHERE c.CDSK_ITEM_CODE=#{item.ProductCode,jdbcType=VARCHAR}
                AND w.WMST_SKU_UNIT=#{item.ProductUnit,jdbcType=VARCHAR} 
                AND w.WMST_WR_ID=${conditions.wrId} AND w.WMST_CUSTOMER_CODE=#{conditions.customerCode,jdbcType=VARCHAR} 
              </foreach>
             ) alias WHERE alias.WMST_ENABLED_NUMBER>0;
    </select>

 7. 

原文地址:https://www.cnblogs.com/Jtianlin/p/9021354.html