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”;
/**<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 /> }
/**<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);
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 /> }
/**<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
@Autowired
private YwTplsDaoH2 ywTplsDao;
@Override<br /> public int save(YwTpls model) {<br /> return ywTplsDao.insertSelective(model);<br /> }
@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