https://blog.csdn.net/qq262593421/article/details/108651119
    http://www.vue5.com/h2_database/h2_database_create.html

    自己整合内容:
    springboot 整合h2database
    application.yml
    #h2database后台配置
    spring:
    h2:
    console:
    path: /h2 #进入h2 web操作界面的路径 http://127.0.0.1:9004/h2/ 默认是h2-console
    enabled: true #开启web console功能
    settings:
    web-allow-others: true

    数据源自定义
    dsh2:
    driver-class-name: org.h2.Driver
    initialization-mode: always #不起作用
    schema: classpath:h2db/schema.sql # 每次启动程序,都会运行以对数据库操作(注意:这里不起作用,所以在DataSourceConfigH2.java初始化sessionFactoryH2时执行)
    # data: classpath:db/data-h2.sql # 每次启动程序,都会运行以对数据库的数据操作(这里不起作用)
    #url: jdbc:h2:mem:test #配置h2数据库的连接地址(内存数据库)
    url: jdbc:h2:file:D:/apache-tomcat-8.5.51/webapps/sxzd_log/h2db/sxzdDb;FILE_LOCK=SOCKET #配置h2数据库的连接地址./sxzdDb
    username: root
    password: 123456

    DataSouceConfigH2.java ,因为多个数据源
    package com.hy.datasource;

    import com.alibaba.druid.pool.DruidDataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
    import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import tk.mybatis.mapper.autoconfigure.SpringBootVFS;
    import tk.mybatis.spring.annotation.MapperScan;

    import javax.sql.DataSource;

    /

    MapperScan是tk.mybatis.spring.annotation.MapperScan
    扫包扫到自定义BaseMapper会报错
    解决方法,1:不扫包,自己的Mapper上加@Mapper注解(个人推荐)
    2:把自定义BaseMapper放到扫包路径外 (一般做法)
    3:配置markerInterface,(个人选择)
    @author
    @date 2019.1.22
    /
    @Configuration
    @EnableTransactionManagement
    @MapperScan(basePackages = DataSouceConfigH2.PACKAGE, sqlSessionFactoryRef = “sessionFactoryH2”) /
    , markerInterface=com.hy.base.dao.BaseDao.class/
    public class DataSouceConfigH2 {
    public static final String PACKAGE = “com.hy.h2db.dao”;
    public static final String MAPPER = “classpath
    :com/hy/h2db/mapper/
    /*.xml”;
    public static final String TYPEALIASESPACKAGE = “com.hy.model”;

    1. /**<br /> * 定义数据源<br /> * 注意@Primary注解表示:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常<br /> *<br /> * @return<br /> * @throws Exception<br /> */<br /> @Bean(name = "dataSourceH2")<br /> @ConfigurationProperties(prefix = "jdbc.dsh2")<br /> public DataSource dataSource() throws Exception {<br /> DruidDataSource datasource = new DruidDataSource();<br /> //setMultiStatementAllow 允许多sql<br /> /*WallConfig wallConfig = new WallConfig();<br /> wallConfig.setMultiStatementAllow(true);<br /> WallFilter wallFilter = new WallFilter();<br /> wallFilter.setConfig(wallConfig);<br /> List<Filter> filters2 = new ArrayList();<br /> filters2.add(wallFilter);<br /> datasource.setProxyFilters(filters2);*/<br /> return datasource;<br /> }
    2. /**<br /> * 定义session工厂<br /> * 注:ualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,<br /> * 我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一!<br /> *<br /> * @param dataSource<br /> * @return<br /> * @throws Exception<br /> */<br /> @Bean(name = "sessionFactoryH2")<br /> public SqlSessionFactory sessionFactory(@Qualifier("dataSourceH2") DataSource dataSource) throws Exception {<br /> SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();<br /> sessionFactory.setDataSource(dataSource);
    3. PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();<br /> sessionFactory.setVfs(SpringBootVFS.class); // 关键,将vfs设置为SpringBootVFS<br /> sessionFactory.setTypeAliasesPackage(TYPEALIASESPACKAGE);<br /> sessionFactory.setMapperLocations(resolver.getResources(DataSouceConfigH2.MAPPER));<br /> org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();<br /> configuration.setMapUnderscoreToCamelCase(true);<br /> sessionFactory.setConfiguration(configuration);<br />//这里初始化了数据脚本<br /> **try {**<br />** Resource schema = new ClassPathResource("h2db/schema.sql");**<br />** ResourceDatabasePopulator dbp = new ResourceDatabasePopulator();**<br />** dbp.addScript(schema);**<br />** DatabasePopulatorUtils.execute(dbp, dataSource);**<br />** }catch (Exception e){**<br />** e.printStackTrace();**<br />** }**<br /> return sessionFactory.getObject();<br /> }
    4. /**<br /> * 定义事务管理器<br /> *<br /> * @param dataSource<br /> * @return<br /> */<br /> @Bean(name = "transactionManagerH2")<br /> //@Override<br /> public DataSourceTransactionManager transactionManager(@Qualifier("dataSourceH2") DataSource dataSource) {<br /> return new DataSourceTransactionManager(dataSource);<br /> }<br />}

    YwTplsDaoH2.java 多数据源不能继承 BaseDAO,因为BaseServiceImpl 实例化BaseDAO时不知道使用哪个 YwTplsDaoH2和YwTplsDao
    @Mapper
    public interface YwTplsDaoH2 extends tk.mybatis.mapper.common.Mapper {

    }

    YwTplsServiceH2Impl.java 继承自BaseServiceImpl ,但不使用里面方法,因为BaseServiceImpl里面的BaseDao是实例化的YwTplsDao ,所以全部重载
    @Service
    @Transactional(rollbackFor = Exception.class,transactionManager = “transactionManagerH2”) //多数据源
    public class YwTplsServiceH2Impl extends BaseServiceImpl implements YwTplsServiceH2 {
    @Autowired
    private YwTplsDaoH2 ywTplsDao;

    1. @Override<br /> public int save(YwTpls model) {<br /> return ywTplsDao.insertSelective(model);<br /> }
    2. @Override<br /> public int update(YwTpls model) {<br /> return ywTplsDao.updateByPrimaryKeySelective(model);<br /> }<br />}<br />YwTplsServiceH2.java<br />public interface YwTplsServiceH2 extends BaseService<YwTpls> {<br />}

    遇到的坑:==================================
    网上的配置:
    spring:
    jpa:
    show-sql: true
    #设置ddl模式
    hibernate:
    ddl-auto: update
    # database-platform: org.hibernate.dialect.H2Dialect
    ##数据库连接设置
    datasource:
    driverClassName: org.h2.Driver
    #可执行程序的当前路径
    url: jdbc:h2:mem:test
    #指定的静态配置路径
    username: h2
    password: h2
    ##数据初始化设置
    #进行该配置后,每次启动程序,程序都会运行resources/db/schema.sql文件,对数据库的结构进行操作。
    schema: classpath:db/schema.sql
    #进行该配置后,每次启动程序,程序都会运行resources/db/data.sql文件,对数据库的数据操作。
    data: classpath:db/data.sql
    ##h2 web console设置
    #表明使用的数据库平台是h2
    platform: h2
    # 进行该配置后,h2 web consloe就可以在远程访问了。否则只能在本机访问。
    h2:
    console:
    settings:
    web-allow-others: true
    #进行该配置,你就可以通过YOUR_URL/h2访问h2 web consloe。YOUR_URL是你程序的访问URl。
    path: /h2
    #进行该配置,程序开启时就会启动h2 web consloe。当然这是默认的,如果你不想在启动程序时启动h2 web consloe,那么就设置为false。
    enabled: TRUE

    其中:对于spring2.0版本 其中的
    initialization-mode: always
    SCHEMA:
    DATA:
    已过期,应为
    spring:
    sql:
    init:
    mode: always
    schema-locations: classpath:h2db/schema.sql


    但是即使改了上面的,对于单数据源可以执行了,但多数据源(不同数据库,受到sql语法限制不能统一执行,而且有的数据库已创建了表)
    所以改为在 DataSouceConfigH2 这里的初始化SqlSessionFactory时执行

    try {
    Resource schema = new ClassPathResource(“h2db/schema.sql”);
    ResourceDatabasePopulator dbp = new ResourceDatabasePopulator();
    dbp.addScript(schema);
    DatabasePopulatorUtils.execute(dbp, dataSource);
    }catch (Exception e){
    e.printStackTrace();
    }
    遇到的问题:
    //数据量卡
    rurl = “jdbc:h2:file:/“ + getDBPath() + dbname + “;CACHE_SIZE=” + (1024 * 1024) + “;PAGE_SIZE=512”;
    //h2数据库被锁定解决方案
    官网也提供了解决方案,改成socket锁定,不维护锁文件:
    String url = “jdbc:h2:~/test;FILE_LOCK=SOCKET”;
    此外还有FILE,FS,NO等选项。其中NO是不锁数据库,但是有数据损坏风险。
    https://blog.csdn.net/u011870280/article/details/85099404