背景
在使用springboot2 + jpa 的项目环境中,发现创建的表引擎都是MyISAM,如果是本地简单的单表测试当然没有问题,但是大家都知道MyISAM引擎是不支持事务的,这在实际的项目环境中是比较致命的,所以需要修改成InnoDB引擎。
查找解决方案
第一时间当然是百度了(google党请轻喷),果然发现不少博客文章,直接使用博客方案:
将application.yml中添加如下配置
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
重启应用,发现表仍然是MyISAM引擎。
既然无效,那么换个思路,看看博客的查找问题思路:
1.查找日志
发现如下启动日志:
2019-03-25 16:13:49,792:INFO main (Dialect.java:157) - HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
说明起决定作用的是这个dialect,那么只要将其修改为正确的值即可,打开类MySQL5InnoDBDialect,发现其实该类已经被标记为@Deprecated,那么一定是有了新的替代方案,查看其父类未找到关键点,再往上查找父类的父类MySQLDialect,关键代码如下:
String storageEngine = Environment.getProperties().getProperty("hibernate.dialect.storage_engine");
if (storageEngine == null) {
storageEngine = System.getProperty("hibernate.dialect.storage_engine");
}
if (storageEngine == null) {
this.storageEngine = this.getDefaultMySQLStorageEngine();
} else if ("innodb".equals(storageEngine.toLowerCase())) {
this.storageEngine = InnoDBStorageEngine.INSTANCE;
} else {
if (!"myisam".equals(storageEngine.toLowerCase())) {
throw new UnsupportedOperationException("The " + storageEngine + " storage engine is not supported!");
}
this.storageEngine = MyISAMStorageEngine.INSTANCE;
}
从这段代码可以看出MySQL默认的引擎为MyISAM,这就是我们在没有指定的情况下为MyISAM的原因了,既然是这样,那么我们直接看MySQLDialect有哪些实现类就ok了,
实现类.png
可以看到MySQL55Dialect这个实现类,打开该类:
MySQL55Dialect.png
由上图看到获取默认的引擎的实现方法返回的InnoDB,看到这里感觉离成功不远了,再看其子类,发现有MySQL57Dialect、MySQL8Dialect,很明显中间的55 57 指的是版本了,通过mysql -V指令查我们的MySQL版本为5.7,故使用如下配:
spring.jpa.database-platform: org.hibernate.dialect.MySQL57Dialect
验证
重启应用查看数据库表结构,发现创建的table已经是InnoDB引擎了。
网友评论