达梦 | 记一次国产数据库适配的思考过程
简介:达梦数据库管理系统是由达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。达梦为中国电子信息产业集团(CEC)旗下基础软件企业,其可靠性、高性能、海量数据处理和安全性做了大量的研发和改进工作,极大提升了达梦数据库产品的性能、可靠性、可扩展性,能同时兼顾OLTP和OLAP请求。
Q
DM达梦数据库安装,其对应版本及驱动如何选取,适配程度更佳?
https://pan.baidu.com/s/1nFBEnX3lYqIjBZo8ZPADgg
其中,达梦8 JDBC驱动版本说明
1. DmJdbcDriver16 对应 Jdk1.6 及以上环境
2. DmJdbcDriver17 对应 Jdk1.7 及以上环境
3. DmJdbcDriver18 对应 Jdk1.8 及以上环境
达梦8 hibernate方言包对应版本说明:
1. DmDialect-for-hibernate2.0.jar 对应 Jdk1.4及以上, hibernate2.0 环境。
2. DmDialect-for-hibernate2.1.jar 对应 Jdk1.4及以上, hibernate2.1 2.X 环境。
3. DmDialect-for-hibernate3.0.jar 对应 Jdk1.4及以上, hibernate3.0 环境。
4. DmDialect-for-hibernate3.1.jar 对应 Jdk1.4及以上, hibernate3.1 3.5 环境。
5. DmDialect-for-hibernate3.6.jar 对应 Jdk1.5及以上, hibernate3.6 3.X 环境。
6. DmDialect-for-hibernate4.0.jar 对应 Jdk1.6及以上, hibernate4.0 4.X 环境。
7. DmDialect-for-hibernate5.0.jar 对应 Jdk1.7及以上, hibernate5.0 5.2 环境。
8. DmDialect-for-hibernate5.3.jar 对应 Jdk1.7及以上, hibernate5.3 5.4 环境。
说明:以上的hibernate版本指的是Hibernate ORM版本,注意区分hibernate search版本。
Hibernate.cfg.xml配置说明
i、驱动名称
<property name="connection.driver_class">dm.jdbc.driver.DmDriver</property>
ii、方言包名称
<property name="dialect">org.hibernate.dialect.DmDialect</property>
其他jar包说明:
1. DmDictionary.jar openjpa1.2方言包,对应 Jdk1.6及以上环境。
2. dmjooq-dialect-3.12.3.jar jooq方言包,对应 Jdk1.8及以上环境。
3. dm8-oracle-jdbc16-wrapper.jar oracle 到达梦的JDBC驱动桥接,应用中如果使用了非标准的oracle JDBC特有的对象,无需修改应用代码,可以桥接到达梦的JDBC连接达梦数据库,对应 Jdk1.6及以上环境。
4. DmHibernateSpatial-1.0.jar hibernatespatial方言包,对应hibernate spatial 1.0 环境,对应 Jdk1.5及以上环境。
5. DmHibernateSpatial-1.1.jar hibernatespatial方言包,对应hibernate spatial 1.1环境,对应 Jdk1.5及以上环境。
6. gt-dameng-2.8.jar GeoServer 2.8环境方言包,对应 Jdk1.6及以上环境。
7. gt-dameng-2.11.jar GeoServer 2.11环境方言包,对应 Jdk1.8及以上环境。
8. gt-dameng-2.15.jar GeoServer 2.15环境方言包,对应 Jdk1.8及以上环境。
二、DM8&Client
接下来,打开DM8客户端,可通过dm sql脚本方式去创建表,这里只是简单创建了一张crm_version表。这里尤其需要注意的是创建表名不需要带双引号,达梦默认是大写,sql方言中也不需要额外处理,若是通过DM8工具去建表建字段或者带小写加双引号创建脚本,出现双引号则在实际的sql方言中也需要加上双引号,否则执行sql会抛出视图或表不存在,字段列名不存在的异常。
若是通过Mysql 或Oracle或其他数据库,文件等方式迁移导入。这里记录一下迁移过程中遇到的问题,在迁移的时候,报某些字段超长。于是,查看了MySql中那些字段的类型及长度,都是varchar(50) 。这里应该是迁移有些字段,须在DM数据库中增加位宽,在MySql中varchar是表示字符,varchar(50)表示可以存放50个字符,但是DM的默认跟Oracle是一样的,varchar(50)表示50个字节。这就意味着,50个字节,如果存中文,在utf-8的字符集下,只能存多16个。所以,如果MySql库到DM,varchar类型,需特别留意一下。
三、DM8&DmJdbcDriver
然后,在项目工程中引入达梦数据库驱动,SpringBoot对MySql做了集成,没有get到对达梦数据库做集成,小编这里采用的jdk1.8,安装的达梦数据库也是DM8,所以这里引入:
DmJdbcDriver18,其相对于DmJdbcDriver17作出了很大的改进。
i、本地引入的方式
在pom.xml文件中,引入依赖jar
<!-- 达梦数据库驱动 -->
<dependency>
<groupId>com.dm</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/DmJdbcDriver18.jar</systemPath>
</dependency>
ii、nexus私服引入的方式
在pom.xml文件中,引入依赖jar
<!-- 达梦数据库驱动 -->
<dependency>
<groupId>com.dm</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>1.8</version>
</dependency>
说明:这里的groupId坐标参数,可由使用者自行在nexus中upload创建声明,然后在pom.xml中引入相关坐标即可。
扩展:若是需要从本地deploy到nexus或是先获取本地仓库.m2的包->nexus仓库的包->aliyun maven仓库的包,为了解决开发过程中jar包拉取异常等问题,则在maven中settings.xml中可这样去配置:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 本地仓库 -->
<localRepository>D:/.m2</localRepository>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>yd nexus</name>
<url>http://ip:port/repository/maven-public/</url>
</mirror>
</mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>maven-snapshots</id>
<url>http://ip:port/repository/maven-snapshots/</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>maven-releases</id>
<url>http://ip:port/repository/maven-releases/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
</profile>
</profiles>
<servers>
<server>
<id>nexus</id>
<username>yxd179</username>
<password>yxd179</password>
</server>
<server>
<id>maven-releases</id>
<username>yxd179</username>
<password>yxd179</password>
</server>
<server>
<id>maven-snapshots</id>
<username>yxd179</username>
<password>yxd179</password>
</server>
</servers>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
四、配置达梦数据库的信息
说明:这里采取Nacos注册中心去管理项目工程中用到的一些配置信息,Nacos的介绍具体可参考小编上篇公众号:
https://mp.weixin.qq.com/s/UyQ6wHGMyrGnDRwNZaJz0Q
至此,达梦数据库环境安装,相关版本及其依赖的选取跟引入,配置信息完毕。
Q
在DM8达梦数据库适配的项目工程中,多数据库兼容+数据库连接池+ORM映射框架+分页相关控件?
// 驱动-连接地址-账号-密码等信息
String driverClassName = "dm.jdbc.driver.DmDriver";
String url = "jdbc:dm://localhost:5236/";
String username = "yxd179";
String password = "yxd179";
// 加载驱动
Class.forName(driverClassName);
// 获取数据库连接对象
Connection con = (Connection) DriverManager.getConnection(url,username,password);
// 获取数据库操作对象
PreparesStatement ps = con.preparesStatement("SELECT COUNT(*) FROM TEST;");
// 执行sql
ResultSet rs= ps.executeQuery();
// 这里还可以获取到数据库产品名称
DatabaseMetaData metaData = (DatabaseMetaData) con.getMetaData();
// 这里为后续提到的在xml指定达梦的databaseId奠定基础
System.out.println("数据库产品名称:" + metaData.getDatabaseProductName());
后需关闭连接close,释放资源->rs-ps-con.
Q
DM8达梦数据库在多数据库切换中,其databaseId如何能够被ORM映射框架MyBatis指定访问?
protected BoundSql getPageBoundSql(Object parameterObject) {
String tempSql = sql;
String orderBy = PageHelper.getOrderBy();
if (orderBy != null) {
tempSql = OrderByParser.converToOrderBySql(sql, orderBy);
}
tempSql = localParser.get().getPageSql(tempSql);
return new BoundSql(configuration, tempSql, localParser.get().getPageParameterMapping(configuration, original.getBoundSql(parameterObject)), parameterObject);
}
//当然,这里有很多其他的Parser,这里可扩展,可兼容,去适用于不同的数据库
public String getPageSql(String sql) {
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 120);
sqlBuilder.append("select * from ( select tmp_page.*, rownum row_id from ( ");
sqlBuilder.append(sql);
sqlBuilder.append(" ) tmp_page where rownum <= ? ) where row_id > ?");
return sqlBuilder.toString();
}
Q
DM8、MySql、Oracle等数据库切换过程对比,除了各自方言异同,是否还有其他新发现?
来自:https://mp.weixin.qq.com/s/QIp2mVJLRYHT48LMaso9wA
相关文章