ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

达梦数据库核心原理与生产实践:表空间、JDBC连接池与锁处理

达梦数据库核心原理与生产实践:表空间、JDBC连接池与锁处理 1. 项目概述为什么达梦数据库值得花时间真正搞懂达梦数据库不是又一个“国产替代”的模糊概念而是一个在金融、电力、政务等关键行业真实跑着核心交易系统、承载着每天数亿笔资金清算和千万级用户实时查询的成熟商业数据库。我从2015年开始接触达梦最早是在一家省级农信社做核心系统灾备改造当时第一次看到DM8的执行计划里出现“向量化扫描”和“列式存储优化器”心里就清楚这玩意儿不是Oracle的简单仿制品它有自己的技术哲学。达梦DM数据库知识分享核心不是教你背命令而是帮你建立一套“在国产数据库语境下思考问题”的底层逻辑——比如当别人问“dm表锁住了怎么解锁”资深DBA第一反应不是查v$lock而是先看事务隔离级别是否被误设为SERIALIZABLE再确认应用层有没有未提交的长事务当看到“flink的jdbc连接器异常”经验丰富的工程师会立刻检查DM JDBC驱动版本与Flink Runtime的JVM版本兼容性而不是一上来就重装驱动。这个分享面向三类人一是正在用达梦做项目交付的开发和DBA需要快速解决生产环境里的“表空间不足”“索引失效”“连接池超时”这些具体问题二是高校做“数据库课程设计”的学生和老师达梦提供了比MySQL更贴近企业级场景的权限模型、审计体系和高可用架构三是准备技术选型的架构师你需要知道达梦的“两地三中心”方案如何通过DMDSCDMHS实现RPO0而不是只看白皮书上的PPT。关键词“达梦”“DM”“JDBC”“表空间”背后是国产数据库生态落地的真实切口——它不浪漫但很硬核。2. 达梦数据库整体设计与思路拆解2.1 从Oracle到达梦不是模仿而是重构思维范式很多人初学达梦习惯性地把Oracle的SQL写法、调优思路直接搬过来结果踩坑无数。根本原因在于达梦虽然语法高度兼容Oracle但内核设计理念完全不同。Oracle是“以块为中心”的行式存储而达梦DM8默认采用“混合存储引擎”对OLAP类大表自动启用列存压缩对OLTP小表则用行存保证点查性能。这意味着当你在达梦里建一张千万级订单表如果没显式指定STORAGE (CLUSTERBTR)系统可能按数据特征自动选择列存这时你用SELECT * FROM orders WHERE order_id ?这种典型OLTP语句性能反而不如行存。我见过最典型的案例某券商把Oracle的订单库全量迁到达梦没做任何存储引擎适配结果交易员下单延迟从200ms飙升到1.8秒。后来我们把核心交易表强制指定为STORAGE (ROW)并重建CLUSTERBTR索引延迟回到150ms以内。所以达梦的设计思路第一条就是存储引擎选择权必须交给DBA不能依赖自动判断。这和MySQL的InnoDB默认统一引擎、PostgreSQL的堆表TOAST机制有本质区别。2.2 表空间不只是“磁盘空间容器”而是性能与安全的策略单元在达梦里“表空间”这个词的分量远超Oracle或MySQL。它不仅是物理文件的逻辑分组更是权限控制、备份粒度、IO隔离的最小策略单元。举个例子达梦的SYSTEM表空间默认只允许DBA访问普通用户连SELECT权限都没有这比Oracle的SYSTEM表空间开放程度严格得多。更关键的是达梦支持“加密表空间”你可以在创建时直接指定ENCRYPT WITH AES256所有写入该表空间的数据页自动加密连DBA都无法绕过密钥读取明文——这在金融行业审计中是刚需。而网络热词里频繁出现的“navicat如何建一个表空间”恰恰暴露了工具链的断层Navicat对达梦的表空间管理仅支持基础创建无法配置加密、压缩、IO优先级等高级参数。实际生产中我们给核心账务库建三个表空间TS_ACCNT_DATA加密高IO优先级、TS_ACCNT_IDX非加密SSD专用、TS_ACCNT_LOG归档日志专用只读。这样做的好处是当某天SSD盘IO打满时索引查询不会拖慢数据写入因为它们走的是不同物理路径。这种精细化的IO治理在Oracle里要靠ASM磁盘组IORM策略才能实现而在达梦里一张CREATE TABLESPACE语句就搞定。2.3 JDBC连接池hikrcp不是噱头而是为国产中间件生态定制的协议栈“达梦 hikrcp 连接池 配置”这个热搜词背后是达梦对Java生态的深度改造。HikRCPPHigh Performance Reliable Connection Pool Protocol不是简单的连接复用而是达梦自研的连接状态同步协议。传统JDBC连接池如HikariCP在Oracle或MySQL上连接断开后只需重连即可但在达梦集群环境下一个连接可能绑定在特定DMDSC节点上如果该节点宕机连接池必须感知到并自动切换到健康节点同时保证事务一致性。HikRCPP正是干这个的。它要求连接字符串必须带?hikrcptruecluster_nodes192.168.1.10:5236,192.168.1.11:5236参数驱动层会主动与集群管理节点通信实时获取节点健康状态。我实测过当关闭一个DMDSC节点时HikRCPP能在1.2秒内完成连接重路由而标准JDBC连接池平均耗时8.7秒且期间会产生大量SQLException: Connection refused。更狠的是HikRCPP支持“连接粘性”Connection Stickiness对于需要强一致性的查询如SELECT FOR UPDATE它会确保同一事务的所有SQL都路由到同一个节点避免分布式事务开销。这解释了为什么“nacos 适配达梦数据库”需要专门的starter包——Nacos的配置中心服务必须把HikRCPP的节点发现能力集成进去否则服务注册时连接池会反复尝试已下线的节点。2.4 两地三中心达梦的“RPO0”不是靠堆硬件而是靠日志流式编排“达梦两地三中心”常被误解为“多部署几套DMHS达梦数据同步软件就行”。实际上达梦的两地三中心架构是三层协同本地DMDSC集群高可用 同城DMHS日志同步低延迟 异地DMHS异步复制容灾。关键突破点在于DMHS的日志解析引擎。它不像Oracle GoldenGate那样解析redo log而是直接读取达梦的ARCHIVELOG二进制流并进行“语义级压缩”——比如连续100次对同一行的UPDATE balance balance - 1操作在DMHS传输流中会被合并为一条UPDATE balance balance - 100。这使得同城链路带宽占用降低63%RTO从分钟级压到秒级。而网络热词里提到的“datagrip链接jdbc:goldendb:loadbalance://...”恰恰反衬出达梦的差异GoldenDB用loadbalance URL做无状态路由达梦的两地三中心必须用jdbc:dm://192.168.1.10:5236,192.168.1.11:5236/?loadBalancetruefailovertrue其中failovertrue触发的是DMHS的故障转移协议不是简单的DNS轮询。去年我们帮一家城商行做两地三中心验收测试脚本故意拔掉主中心光纤业务系统在4.3秒内自动切换到同城中心全程无数据丢失审计日志显示所有事务都在DMHS的REDO APPLY QUEUE中完成回放。这种确定性是靠日志流式编排内存队列预分配事务槽位共同实现的不是靠“堆机器”。3. 核心细节解析与实操要点3.1 表空间创建与管理从“能用”到“高效可控”的七步法达梦的表空间管理新手常犯两个致命错误一是用CREATE TABLESPACE时忽略DATAFILE路径权限导致实例启动失败二是盲目扩大INITIAL大小造成磁盘碎片。我总结了一套生产环境必用的七步法每一步都有血泪教训路径规划先行达梦要求DATAFILE路径必须是绝对路径且数据库用户如dmdba对该路径有读写权限。千万别用/home/dmdba/dmdata/ts_user.dbf这种家目录路径因为Linux系统升级时可能清空家目录。正确做法是挂载独立磁盘到/dmdata然后创建子目录/dmdata/ts_user再赋权chown dmdba:dinstall /dmdata/ts_user。我曾因路径权限问题在客户现场调试了6小时最后发现是SELinux策略拦截了写操作。初始大小计算公式INITIAL (预估数据量GB × 1.3) ÷ 数据文件数量。这里的1.3是预留30%空间给索引和临时排序。例如预计用户表数据100GB建2个数据文件则每个INITIAL 65G。别学网上教程直接写INITIAL 1G达梦的自动扩展AUTOEXTEND在高并发写入时会引发IO争抢。强制指定存储引擎CREATE TABLESPACE ts_user DATAFILE /dmdata/ts_user/ts_user01.dbf SIZE 65G STORAGE (ROW);。注意STORAGE (ROW)必须显式声明否则DM8默认可能启用列存导致OLTP性能崩盘。加密表空间密钥管理CREATE TABLESPACE ts_encrypted DATAFILE /dmdata/ts_encrypted/ts_enc01.dbf SIZE 50G ENCRYPT WITH AES256 KEY MySecretKey2024!;。密钥必须满足长度≥12位、含大小写字母数字特殊字符。密钥丢失数据永久不可读所以必须用KMS密钥管理系统托管绝不能硬编码在SQL脚本里。在线扩容实操当表空间使用率超85%执行ALTER TABLESPACE ts_user ADD DATAFILE /dmdata/ts_user/ts_user02.dbf SIZE 50G;。重点来了达梦的ADD DATAFILE是在线操作但必须确保新文件路径与原文件在同一磁盘组否则IO负载不均。我们曾把新文件加到NAS存储结果IO等待飙升到200ms。碎片整理黄金窗口达梦没有OPTIMIZE TABLE但有SHRINK SPACE。执行前必须确认表无长事务、无DDL操作、且在业务低峰期。命令是ALTER TABLE user_orders SHRINK SPACE CASCADE;CASCADE参数会同时收缩索引段。实测表明碎片率从45%降到8%后全表扫描性能提升3.2倍。监控告警阈值设置在达梦管理工具DM Manager中为表空间配置告警使用率 85%发邮件 95%触发自动扩容脚本。脚本核心逻辑是调用disql执行ALTER TABLESPACE ... ADD DATAFILE但必须加锁防止并发扩容冲突。我们用flock -x /tmp/ts_expand.lock -c disql ...实现原子性。提示达梦的v$tablespace视图里STATUS字段为ONLINE才表示可用OFFLINE不等于“禁用”而是“管理员手动下线”此时仍可读取数据但禁止写入。很多DBA误以为OFFLINE是故障状态其实它是维护手段。3.2 JDBC连接池深度配置HikRCPP的12个关键参数详解“达梦 连接池 配置”不是填几个URL参数就完事。HikRCPP连接池的威力藏在12个关键参数的精细调优里。我以Spring Boot项目为例逐条拆解spring: datasource: url: jdbc:dm://192.168.1.10:5236,192.168.1.11:5236/?hikrcptruecluster_nodes192.168.1.10:5236,192.168.1.11:5236loadBalancetruefailovertrue username: SYSDBA password: SYSDBA hikari: connection-timeout: 30000 validation-timeout: 3000 idle-timeout: 600000 max-lifetime: 1800000 maximum-pool-size: 20 minimum-idle: 5 # HikRCPP专属参数 connection-init-sql: SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED leak-detection-threshold: 60000 # 达梦特有参数 allow-multi-queries: false use-server-prep-stmts: true cache-prep-stmts: true prep-stmt-cache-size: 250 prep-stmt-cache-sql-limit: 2048hikrcptrue开启HikRCPP协议这是连接池智能路由的前提。不加此参数连接池就是普通JDBC无法感知DMDSC节点状态。cluster_nodes必须与DMDSC集群的实际IP:PORT完全一致且顺序无关。但要注意如果节点IP是内网地址而应用服务器在公网必须配置NAT映射否则连接会超时。loadBalancetrue启用负载均衡HikRCPP会根据各节点的ACTIVE_SESSIONS指标动态分配连接。实测发现当节点A有120个活跃会话、节点B有30个时新连接90%会路由到B。failovertrue开启故障转移。关键点在于failover-timeout默认30秒它定义了节点失联后多久触发切换。我们调成1000010秒因为金融交易不能等30秒。connection-init-sql这是达梦的“连接初始化神技”。每次连接从池中取出时自动执行SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED避免应用代码漏设隔离级别导致幻读。Oracle里没有这个参数必须在代码里显式setTransactionIsolation。allow-multi-queriesfalse达梦不支持多语句执行如INSERT; UPDATE;设为true会导致SQLException: Multi-query not supported。这点和MySQL截然相反。use-server-prep-stmtstrue强制使用服务端预编译达梦的PREPARE语句在服务端缓存执行计划比客户端拼SQL快40%。但要注意cache-prep-stmts必须为true才能生效。prep-stmt-cache-size预编译语句缓存大小。达梦默认缓存200条我们调到250因为核心交易有237个固定SQL模板。leak-detection-threshold连接泄漏检测阈值。设为6000060秒如果连接被借出超过60秒未归还HikariCP会打印堆栈日志。我们靠这个抓出了一个第三方SDK的连接未关闭Bug。注意达梦的JDBC驱动jar包名是DmJdbcDriver18.jarDM8对应18不是dmjdbcdriver17.jarDM7。版本错配会导致ClassNotFoundException: dm.jdbc.driver.DmDriver。下载必须去达梦官网第三方源可能被篡改。3.3 表锁处理实战从“dm 表锁住了怎么解锁”到根因分析“dm表锁住了怎么解锁”是达梦DBA最常被呼叫的紧急事件。但直接KILL会话是下策90%的锁问题源于应用层缺陷。我的处理流程是四步诊断法第一步快速定位锁源头用达梦管理工具执行SELECT s.SESSION_ID, s.USER_NAME, s.CLIENT_IP, s.PROGRAM_NAME, t.SQL_TEXT, l.LOCK_TYPE, l.OBJECT_NAME, l.LOCK_MODE FROM V$SESSIONS s JOIN V$LOCKED_OBJECTS l ON s.SESSION_ID l.SESSION_ID LEFT JOIN V$SQLTEXT t ON s.SQL_HASH_VALUE t.HASH_VALUE WHERE l.OBJECT_NAME USER_ORDERS;重点看CLIENT_IP和PROGRAM_NAME如果是java进程且IP来自应用服务器基本确定是应用代码问题如果是disql且IP是DBA电脑那就是人工操作失误。第二步分析事务状态查V$TRANSACTIONS视图SELECT TID, SESSION_ID, START_TIME, USED_UREC, STATUS, SQL_HASH_VALUE FROM V$TRANSACTIONS WHERE SESSION_ID IN (SELECT SESSION_ID FROM V$LOCKED_OBJECTS WHERE OBJECT_NAME USER_ORDERS);STATUS ACTIVE表示事务还在运行USED_UREC 10000说明修改了大量记录极可能是未提交的大批量更新。第三步安全解锁策略如果是STATUS IDLE且START_TIME超过30分钟执行SP_CLOSE_SESSION(SESSION_ID)安全关闭。如果是STATUS ACTIVE先SELECT * FROM V$SESSIONS WHERE SESSION_ID ?确认STATE EXECUTING再执行SP_KILL_SESSION(SESSION_ID)。注意SP_KILL_SESSION会回滚整个事务可能耗时较长需提前告知业务方。第四步根因修复90%的锁问题来自三类代码未关闭ResultSetJava代码里while(rs.next())后没rs.close()导致游标锁住表。长事务未拆分一个事务更新10万行订单应拆成100个批次每批1000行commit一次。SELECT FOR UPDATE滥用在高并发场景下SELECT FOR UPDATE会升级为行锁应改用SELECT ... LOCK IN SHARE MODE或应用层加分布式锁。我们曾遇到一个经典案例某支付系统在凌晨批量扣款一个事务更新50万行锁表22分钟。最终方案是改用UPDATE ... WHERE rowid IN (SELECT rowid FROM ... ROWNUM 1000)分页更新并在每页后commit。耗时从22分钟降到3分48秒锁表时间缩短到毫秒级。实操心得达梦的V$LOCKED_OBJECTS视图比Oracle的v$locked_object多一个LOCK_HOLD_TIME字段直接显示锁持有秒数。当该值60必须立即介入因为达梦默认DEADLOCK_TIMEOUT60秒超时会自动触发死锁检测。3.4 达梦管理工具DM Manager使用精要不止于图形化界面“dm管理工具下载”和“dm管理工具使用”是高频搜索词但多数人只把它当图形化SQL客户端。其实DM Manager是达梦的“运维中枢”它的隐藏能力远超想象导入Excel的真相“dm管理工具怎么导入excel”功能本质是调用dminit工具的-import参数将Excel转为CSV再执行LOAD DATA。但必须注意Excel必须是.xlsx格式不是.xls且首行必须是列名日期列格式要统一为YYYY-MM-DD。我们曾因Excel日期是2024/3/15格式导入后全变成1900-01-01。备份恢复的“三重保险”DM Manager的备份不是简单拷贝文件。它执行的是BACKUP DATABASE FULL TO /backup/dm_full_bak生成的备份集包含三部分元数据描述文件.bak、数据文件镜像.dbf、归档日志.log。恢复时必须用RESTORE DATABASE FROM /backup/dm_full_bak不能直接复制文件。有一次客户误删了SYSDBA用户我们用备份集恢复3分钟搞定而手动重建用户授权要2小时。性能监控的“黄金三图”在DM Manager的“性能监控”页重点关注三个图表IO等待分布图如果db file sequential read占比40%说明索引设计有问题CPU使用率热力图横轴是时间纵轴是会话ID颜色越深CPU越高能精准定位哪个SQL吃CPU锁等待拓扑图直观显示谁在等谁形成环形即死锁。SQL优化器的“透视眼”在执行计划查看器里右键点击任意操作符如TABLE SCAN选择“详细信息”能看到该操作符的ESTIMATED_ROWS预估行数和ACTUAL_ROWS实际行数。当两者相差10倍以上说明统计信息过期必须执行DBMS_STATS.GATHER_TABLE_STATS(SYSDBA, USER_ORDERS)。安全审计的“一键封神”在“安全管理”模块勾选“开启审计”选择“登录失败”“DDL操作”“敏感数据访问”DM Manager会自动生成审计策略并写入v$audit_record。某次我们发现一个离职员工的账号在凌晨3点尝试登录27次立即冻结账号并溯源。提示DM Manager的默认端口是8080如果与Nginx冲突可在安装目录/dmdbms/tool/manager/conf/server.xml中修改Connector port8080为其他端口。但修改后所有已保存的连接配置里的URL都要同步更新否则连接失败。4. 实操过程与核心环节实现4.1 从零搭建达梦DM8单机环境Linux CentOS 7.6完整步骤达梦数据库安装网上教程良莠不齐很多照着做会卡在/etc/init.d/DmServiceDMSERVER start失败。我以CentOS 7.6为例给出生产环境验证过的完整步骤每一步都标注了“为什么这么做”步骤1系统预检与依赖安装# 检查内核版本达梦DM8要求3.10 uname -r # 检查glibc版本必须≥2.17 ldd --version # 安装必要依赖 yum install -y libaio-devel numactl-devel unixODBC-devel # 创建专用用户和组严禁用root安装 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba echo dmdba:dmdba123 | chpasswd # 赋予sudo权限仅限安装阶段 echo dmdba ALL(ALL) NOPASSWD: ALL /etc/sudoers为什么达梦安装脚本会检查libaio等库是否存在缺失会导致dminstall报错libaio.so.1: cannot open shared object file。用专用用户安装是安全基线要求root安装会埋下权限漏洞。步骤2挂载安装介质并解压# 将达梦ISO挂载到/mnt mount -o loop dm8_20230901_x86_rh6_64_ent_8.1.2.126.iso /mnt # 切换到dmdba用户 su - dmdba # 解压安装包注意必须在/home/dmdba目录下解压 cd /home/dmdba tar -xvf /mnt/DMInstall.bin为什么DMInstall.bin是自解压程序必须在目标用户家目录运行否则解压后的文件权限会混乱。/mnt是临时挂载点不能作为安装路径。步骤3静默安装与实例初始化# 执行静默安装关键参数详解 ./DMInstall.bin -i \ -key XXXX-XXXX-XXXX-XXXX \ -silent \ -ignore \ -dm_lang zh_CN \ -install_path /opt/dmdbms \ -data_path /dmdata \ -db_name DMSERVER \ -db_path /dmdata/DMSERVER \ -db_port 5236 \ -sysdba_pwd Dameng123 \ -charset 1 \ -auto_start y参数详解-key从达梦官网申请的正式授权码试用版可跳过-ignore忽略系统兼容性警告如SELinux开启-charset 11代表UTF-80是GB18030金融系统必须用UTF-8-auto_start y安装完成后自动注册为系统服务。步骤4启动服务与基础验证# 启动服务 sudo /opt/dmdbms/script/root/startDmServicedmservice.sh # 切换到dmdba用disql连接 su - dmdba disql SYSDBA/SYSDBAlocalhost:5236 # 执行验证SQL SQL SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE; SQL SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES;为什么startDmServicedmservice.sh必须用root执行它会修改/etc/init.d/DmServiceDMSERVER的权限。disql是达梦自带的命令行工具比sqlplus更轻量连接成功即证明实例正常。步骤5创建业务用户与表空间-- 在disql中执行 CREATE TABLESPACE TS_APP DATAFILE /dmdata/ts_app/ts_app01.dbf SIZE 10G STORAGE (ROW); CREATE USER app_user IDENTIFIED BY AppPass2024! DEFAULT TABLESPACE TS_APP; GRANT CONNECT, RESOURCE, DBA TO app_user; -- 创建测试表 CREATE TABLE app_user.test_table ( id INT PRIMARY KEY, name VARCHAR(50), create_time DATETIME ); INSERT INTO app_user.test_table VALUES (1, 达梦测试, SYSDATE); COMMIT;为什么RESOURCE角色包含CREATE TABLE等基本权限DBA是临时赋予上线后应收回。SYSDATE是达梦的系统时间函数等价于Oracle的SYSDATE不是MySQL的NOW()。实操心得安装完成后务必执行/opt/dmdbms/tool/manager/startManager.sh启动DM Manager用浏览器访问http://服务器IP:8080首次登录用SYSDBA/SYSDBA。如果打不开检查防火墙sudo firewall-cmd --permanent --add-port8080/tcp然后sudo firewall-cmd --reload。4.2 Flink实时计算对接达梦JDBC连接器异常排查全流程“flink的jdbc连接器异常”是实时数仓项目的高频痛点。Flink 1.17对接达梦DM8常见异常有三类驱动版本不匹配、连接参数缺失、事务隔离冲突。以下是完整的排查与解决流程异常现象Flink任务启动后报错Caused by: java.sql.SQLException: Cannot load JDBC driver class dm.jdbc.driver.DmDriver排查步骤确认驱动jar包位置Flink的lib/目录下必须有DmJdbcDriver18.jar且文件大小≥8MB小于8MB是损坏包。达梦官网下载的驱动包名是DmJdbcDriver18.jar不是dmjdbcdriver18.jar。检查Flink配置在flink-conf.yaml中添加classloader.resolve-order: parent-first # 强制Flink优先加载用户jar避免与内置HikariCP冲突验证驱动加载在Flink Web UI的“Task Managers”页点击任一TM的“Log”搜索DmDriver应看到Loaded JDBC driver: dm.jdbc.driver.DmDriver。异常现象任务运行中报错Caused by: java.sql.SQLException: Transaction isolation level not supported根因分析Flink的JDBC Sink默认使用TRANSACTION_REPEATABLE_READ但达梦DM8只支持READ_COMMITTED和SERIALIZABLE。解决方案是在JDBC URL中强制指定String url jdbc:dm://192.168.1.10:5236/?charSetUTF-8transactionIsolationTRANSACTION_READ_COMMITTED;异常现象Sink写入吞吐量低CPU使用率高优化方案批量写入在Flink DataStream API中用JDBCOutputFormat的setBatchSize(1000)将1000条记录合并为一条INSERT INTO ... VALUES (...),(...),...语句。连接池调优在JDBCConnectionOptions中设置setMaxPoolSize(10)避免连接过多耗尽达梦的MAX_SESSIONS。索引优化达梦对INSERT ... VALUES的批量插入如果目标表有唯一索引会逐行校验。我们把业务主键从BIGINT改为SEQUENCE并关闭UNIQUE INDEX的实时校验吞吐量从800条/秒提升到3200条/秒。完整Flink代码示例JDBCExecutionOptions executionOptions JDBCExecutionOptions.builder() .withBatchSize(1000) .withBatchIntervalMs(200) .withMaxRetries(3) .build(); JDBCConnectionOptions connectionOptions new JDBCConnectionOptions.JDBCConnectionOptionsBuilder() .withUrl(jdbc:dm://192.168.1.10:5236/?charSetUTF-8transactionIsolationTRANSACTION_READ_COMMITTED) .withDriverName(dm.jdbc.driver.DmDriver) .withUsername(app_user) .withPassword(AppPass2024!) .build(); JDBCOutputFormat outputFormat JDBCOutputFormat.buildJDBCOutputFormat() .setDrivername(dm.jdbc.driver.DmDriver) .setDBUrl(jdbc:dm://192.168.1.10:5236/) .setUsername(app_user) .setPassword(AppPass2024!) .setQuery(INSERT INTO app_user.fact_order (order_id, amount, create_time) VALUES (?, ?, ?)) .setSqlTypes(new int[]{Types.BIGINT, Types.DOUBLE, Types.TIMESTAMP}) .setExecutionOptions(executionOptions) .setConnectionOptions(connectionOptions) .finish();注意达梦的TIMESTAMP类型精度是微秒而Flink的Rowtime是毫秒写入时需用new Timestamp(System.currentTimeMillis())不能用LocalDateTime.now()否则会报java.sql.SQLException: Invalid column type。4.3 Navicat连接达梦从“navicat 连接达梦数据库”到专业开发工作流“navicat 如何连接达梦数据库”看似简单但配置不当会导致中文乱码、LOB字段无法查看、执行计划不显示等连锁问题。以下是经过20个项目验证的Navicat 16配置指南第一步驱动配置关键下载达梦官方JDBC驱动DmJdbcDriver18.jar放入Navicat安装目录drivers/子目录。在Navicat中连接→新建连接→Oracle注意选Oracle不是MySQL因为达梦语法兼容Oracle→连接属性→驱动下拉框选择DmJdbcDriver18.jar。第二步连接参数设置连接名达梦-生产库 主机名/IP地址192.168.1.10 端口5236 用户名SYSDBA 密码SYSDBA SIDDMSERVER # 高级选项必须勾选 [√] 使用UnicodeUTF-8 [√] 允许在查询中使用注释 [√] 自动提交 # 驱动参数在“驱动设置”页 charSetUTF-8 disableStatementPoolingtrue useServerPrepStmtstrue为什么disableStatementPoolingtrue禁用Navicat的语句池因为达梦的预编译缓存机制与Navicat冲突会导致PreparedStatement closed异常。useServerPrepStmtstrue启用服务端预编译提升查询速度。第三步解决中文乱码在Navicat中工具→选项→外观→字体将“常规字体”设为Microsoft YaHei大小10。在连接属性的“高级”页字符集下拉框选择UTF-8。执行SQL前先运行SET NAMES UTF8;达梦兼容MySQL语法。第四步专业开发工作流表结构对比工具→结构同步可
返回列表