国产化啊,路漫漫其修远兮啊,这次要把项目用的oracle换成达梦,数据库方面的数据移植交给运维同事做了,我这里做的是服务里的替换,主要是改一些配置
首先是驱动 jar,pom文件里把之前oracle的驱动去掉,引上达梦的驱动
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.3.140</version>
</dependency>
这里是直接中央仓库down的,18的版本,对应就是jdk8,达梦官网都有介绍就不多说了,其实达梦的安装目录下面就带了驱动jar包的,也可以去安装目录取。
然后就是spring boot的配置文件,数据库的
spring:
datasource:
driver-class-name: "dm.jdbc.driver.DmDriver"
url: "jdbc:dm://localhost:5236
druid:
filters: stat
主要是注意驱动的class-name ,url里的协议名
我这里用的druid,这里加了filters,我之前没加filters的时候,会报错,报dbType not support,我这里一开始是这样
dbType not support: null,后面跟的是null,研究了下发现druid里的配置里是没有达梦的,发现是druid的版本低了,引了高版本就好了,一般来说这个报错是:dbType not support : dm,后面跟的是 dm,报这个错的话,可以试下加这个 filters 配置,我是加了这个配置好了,他这里防火墙过滤了dm。
然后我发现服务起来后,有部分sql报错,报的是
Invalid bound statement (not found)
然后我去看了下报错的那个mapper里的sql,发现它里面长这样
<select id="listPage" databaseId="oracle">
</select>
有个databaseId属性,而且指定了oracle
然后看了下配置类
我们项目里用的多数据库源 DatabaseIdProvider,配置是这样的
@Bean
public DatabaseIdProvider getDatabaseIdProvider(){
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
properties.setProperty("Oracle","oracle");
properties.setProperty("MySQL","mysql");
properties.setProperty("DB2","db2");
properties.setProperty("Derby","derby");
properties.setProperty("H2","h2");
properties.setProperty("HSQL","hsql");
properties.setProperty("Informix","informix");
properties.setProperty("MS-SQL","ms-sql");
properties.setProperty("PostgreSQL","postgresql");
properties.setProperty("Sybase","sybase");
properties.setProperty("Hana","hana");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
properties.setProperty这个方法俩参数,前面的是数据库产品名,后面的是自己取得数据库别名
这个东西可以在mapper的标签里写 databaseId 属性来指定走哪个数据库,也就是说,比如oracle的分页跟mysql的分页不一样,那你可以在mapper里写俩方法,分别指定为oracle和mysql,那么数据源在运行的时候会去mapper里找对应的数据库别名,找那个 databaseId ,如果没找到,就找不带 databaseId 的,如果再没找到就报错了,所以我这个报错估计就是因为没有达梦的配置,也没有缺省的配置,只有个oracle的配置,没找到就报错了。
然后看了下达梦是适配oracle的sql的,那我直接加一个配置,让达梦走oracle的sql不就行了吗,
properties.setProperty("DM DBMS", "oracle");
在上面配置类里加了一行这个,然后打包部署,运行,成功了!