国产化适配(达梦+东方通/金蝶)

国产化适配经验总结

摘要

本文通过实际的实践经验,总结出了服务端 SpringBoot 国产化适配的注意事项


国产化适配清单

  • 金蝶AAS V9.0
  • 东方通tongweb 7
  • 达梦DM8 V8.1.1.126

金蝶AAS适配

常见配置和问题

  • jvm

编辑 %domian_home%/bin/startapusic,搜索MEMORY_JVMOPTS
MEMORY_JVMOPTS=“-Xms512m -Xmx1024m -XX:MaxPermSize=256m”

  • 请求

AAS默认是将 DELETE,PUT,TRACE,OPTIONS 这四个请求方式禁用了.

编辑 %domian_home%/config/vm.options,搜索apusic.http.disabledMethods
apusic.http.disabledMethods=DELETE,PUT,TRACE,OPTIONS

  • 端口

编辑 %domian_home%/config/apusic.conf,搜索Port
ATTRIBUTE NAME=“Port” VALUE=“6888”

  • 管理

rhxOmV.jpg

  • 部署FAQ
  1. java.lang.IllegalStateException异常以及解决

当启动时,出现java.lang.IllegalStateException异常时,不必惊慌.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9wZspJnp-1609070048601)(https://s3.ax1x.com/2020/12/26/rhbNEd.jpg)]
原因: 当前对客户端的响应已经结束,不能在响应已经结束(或说消亡)后再向客户端(实际上是缓冲区)输出任何内容.总之,该异常不是代码造成的,是部署出了问题.
解决:将整个项目重新部署一下.
具体操作:重新启动AAS.

项目适配

  • 排除内嵌tomcat
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 移除嵌入式tomcat插件 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 打成war
<packaging>war</packaging>
  • 修改启动类,并重写初始化方法
public class WebApplication extends SpringBootServletInitializer {  
    修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        System.out.println("======WebApplication====start==========");
        return builder.sources(new Class[]{WebApplication.class});
    }
}
  • 注入websoket
@Configuration
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
  • 添加serverlet依赖
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

注意:项目未使用redis但引入redis依赖时,AAS启动将报错

东方通tongweb

常见配置和问题

  • jvm

r49OgJ.jpg

  • 端口

r4CwPU.jpg

  • 部署和部署

r49c4S.jpg

项目适配

  • 打成war
<packaging>war</packaging>
  • 修改启动类,并重写初始化方法
public class WebApplication extends SpringBootServletInitializer {  
    修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        System.out.println("======WebApplication====start==========");
        return builder.sources(new Class[]{WebApplication.class});
    }
}
  • 添加serverlet依赖
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

达梦

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6kzP99S-1609070048606)(https://s3.ax1x.com/2020/12/26/r4Pny9.jpg)]

迁移

r4Plo6.jpg

  • FAQ

乱码解决:指定URL
jdbc:mysql://localhost:3306/meeting?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true

Mybatis的代码处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iyPgQVVm-1609070048608)(https://s3.ax1x.com/2020/12/26/r4iBu9.jpg)]

SQL适配

  1. 模式名+表名 (注意大写模式名)
  <select id="selectAll" resultMap="BaseResultMap">
        select
        meet_info.id,
        meet_info.gmt_create,
        meet_info.gmt_modified,
        meet_info.name,
        meet_info.expect_start_time,
        meet_info.expect_end_time,
        meet_info.room_id,
        meet_info.type_id,
        meet_info.summary,
        meet_info.status,
        is_enabled,
        meet_info.is_deleted,
        meet_room.room_name AS meet_room,
        meet_room.room_location as roomLocation,
        meet_type.type_name as meet_type,
        creator_id
        from "MEETING".meet_info
        inner join "MEETING".meet_room on meet_info.room_id = meet_room.id
        inner join "MEETING".meet_type on meet_info.type_id = meet_type.id
        where meet_info.is_deleted=0
        order by meet_info.expect_start_time desc
    </select>
  1. 达梦如果设置了某个列为主键自增,那么 insert 语句就不能指定主键值

正例:

    <insert id="insert" parameterType="com.bourne.meet.meeting.domain.MeetBallot" useGeneratedKeys="true"
            keyProperty="id" keyColumn="id">

    insert into "MEETING".meet_ballot (  gmt_create, gmt_modified,
      meet_id, issue_id, start_time, 
      interval_time, end_time, ballot_status, 
      is_anonymous, corp_id)
    values (  #{gmtCreate,jdbcType=TIMESTAMP}, #{gmtModified,jdbcType=TIMESTAMP},
      #{meetId,jdbcType=BIGINT}, #{issueId,jdbcType=BIGINT}, #{startTime,jdbcType=TIMESTAMP}, 
      #{intervalTime,jdbcType=INTEGER}, #{endTime,jdbcType=TIMESTAMP}, #{ballotStatus,jdbcType=CHAR}, 
      #{isAnonymous,jdbcType=BIT}, #{corpId,jdbcType=VARCHAR})
  </insert>

反例:

  <insert id="insert" parameterType="com.bourne.meet.meeting.domain.MeetBallot" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    insert into meet_ballot (id, gmt_create, gmt_modified, 
      meet_id, issue_id, start_time, 
      interval_time, end_time, ballot_status, 
      is_anonymous, corp_id)
    values (#{id,jdbcType=BIGINT}, #{gmtCreate,jdbcType=TIMESTAMP}, #{gmtModified,jdbcType=TIMESTAMP}, 
      #{meetId,jdbcType=BIGINT}, #{issueId,jdbcType=BIGINT}, #{startTime,jdbcType=TIMESTAMP}, 
      #{intervalTime,jdbcType=INTEGER}, #{endTime,jdbcType=TIMESTAMP}, #{ballotStatus,jdbcType=CHAR}, 
      #{isAnonymous,jdbcType=BIT}, #{corpId,jdbcType=VARCHAR})
  </insert>
  1. 数据库连接务必设置IP(这样能避免防火墙和达梦数据库的隔离策略导致的很多问题)

  2. 达梦不支持函数: LAST_INSERT_ID()

  3. 达梦日期时间函数适配

DATE_SUB(NOW(), INTERVAL 1 MONTH) --> NOW() - INTERVAL '1' MONTH

  1. 不能使用关键字作为列名

  2. 批量操作不能返回受影响记录数
    T}, #{corpId,jdbcType=VARCHAR})


3. 数据库连接务必设置IP(这样能避免防火墙和达梦数据库的隔离策略导致的很多问题)

4. 达梦不支持函数: `LAST_INSERT_ID()`

5. 达梦日期时间函数适配

`DATE_SUB(NOW(), INTERVAL 1 MONTH) --> NOW() - INTERVAL '1' MONTH`

6. 不能使用关键字作为列名

7. 批量操作不能返回受影响记录数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳宗德

您的鼓励是我进步的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值