JAVA

报错【未经授权的用户】的原因有哪些?

使用 druid 做连接池,在连接 DM 数据库时提示【未经授权的用户】有两种原因:

  • 在 DM 管理工具中,此用户的资源限制中【会话持续期】进行了限制,把此限制取消即可。

资源限制

  • 连接池中的会话满了或者空会话未回收等原因造成用户无法连接。

DM 如何支持 C3P0 连接池?

参考下面的 SpringBoot 集成 MyBatis 与 C3P0 连接池例子:

  • 添加依赖

添加依赖

  • 添加 JDBC 驱动

    添加驱动

  • 通过 application.properties 配置文件配置数据源

配置数据源

  • 创建 DataSourceConfig 类

创建类

  • 编写测试代码
  • 实体类

image-20200618131711296

  • XML 映射文件

映射文件

  • Controller

controller

  • 执行结果

执行结果

如何连接 DM 数据库

连接池配置:支持 DruidDataSource 数据源的连接,DruidDataSource 配置说明:

  • name: 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。如果没有配置,将会生成一个名字,格式是:“DataSource-” + System.identityHashCode(this)。另外配置此属性至少在 1.0.5 版本中是不起作用的,强行设置 name 会出错。
  • URL: 连接数据库的 URL,不同数据库不一样。例如:
jdbc.driver=dm.jdbc.driver.DmDriver(达梦数据库驱动)
jdbc.url=jdbc:dm://192.168.10.1:5236(数据库 IP:端口号)
jdbc.username=SZ_TYSL(用户名)
jdbc.password=123456789(用户密码)
  • username: 连接数据库的用户名。
  • password: 连接数据库的密码。如果不希望密码直接写在配置文件中,可以使用 ConfigFilter。其作用包括:从配置文件中读取配置;从远程 http 文件中读取配置,查看详情配置。
  • driverClassName: 默认可根据 URL 自动识别。这一项可配可不配,如果不配置 druid 会根据 URL 自动识别 dbType,然后选择相应的 driverClassName。
  • initialSize: 默认值 0。初始化时建立物理连接的个数,初始化发生在显示调用 init 方法,或者第一次 getConnection 时。
  • maxActive: 默认值 8。最大连接池数量。
  • maxIdle: 已经不再使用,配置了也没效果,可忽略。说明:maxIdle 是 Druid 为了方便 DBCP 用户迁移而增加的,maxIdle 是一个混乱的概念。连接池只应该有 maxPoolSize 和 minPoolSize,druid 只保留了 maxActive 和 minIdle,分别相当于 maxPoolSize 和 minPoolSize。
  • minIdle: 最小连接池数量。
  • maxWait: 获取连接时最大等待时间,单位毫秒。配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 useUnfairLock 属性为 true 来使用非公平锁。
  • 参考通用配置:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  <property name="url" value="${jdbc_url}" />
  <property name="username" value="${jdbc_user}" />
  <property name="password" value="${jdbc_password}" />
  <property name="filters" value="stat" />
  <property name="maxActive" value="20" />
  <property name="initialSize" value="1" />
  <property name="maxWait" value="60000" />
  <property name="minIdle" value="1" />
  <property name="timeBetweenEvictionRunsMillis" value="60000" />
  <property name="minEvictableIdleTimeMillis" value="300000" />
  <property name="testWhileIdle" value="true" />
  <property name="testOnBorrow" value="false" />
  <property name="testOnReturn" value="false" />
  <property name="poolPreparedStatements" value="true" />
  <property name="maxOpenPreparedStatements" value="20" />
  <property name="asyncInit" value="true" />
</bean>

JAVA 的连接配置方式

连接单机数据库配置如下:

配置信息

集群配置连接如下:

在 dm_svc.conf 文件中配置服务名,通过服务名连接集群可实现故障自动重连。

  • Window 环境

Windows 平台 dm_svc.conf 文件位 %SystemRoot%\system32 目录下:

目录

  • Linux 环境

Linux 平台 dm_svc.conf 文件位于 /etc 目录下:

路径

注意 dm_svc.conf 文件权限问题。

在应用程序所在服务器上配置 dm_svc.conf 文件。在 dm_svc.conf 文件中配置服务名 dw_svc

dw_svc=(192.168.100.136:32141,192.168.100.137:32142)
LOGIN_MODE=(1)
SWITCH_TIME=(3)
SWITCH_INTERVAL=(1000)
RW_SEPARATE=(1)
RW_PERCENT=(25)
CHAR_CODE=(PG_UTF8)

JDBC URL 连接串写法如下:

连接串

  • 其他环境

在部分云环境下在配置达梦的数据库连接时,由于云环境无法配置/etc/dm_svc.conf 文件,针对集群的连接就无法配置服务名了。此时,可利用 jdbc 连接串中指定服务名的属性连接 DM 数据库,使用方式如下:

jdbc:dm://test?test=(192.168.137.101:5236,192.168.137.102:5236) & loginMode=1

activiti 连接 DM 数据库报错

报错信息:Unknown database: DM DBMS;Error getting default schema

activiti 支持链接 DM 数据库,我们需要解决的是如何配置问题,只需要修改以下两个配置文件:

  • 第一个是 jdbc 的配置:更换驱动、类名、连接串等,下面是配置方式:

配置方法

这里的意思是:连接串改成达梦的。

  • 第二个是 activiti 自己的配置(要找到 activiti 的配置文件),强制指定数据类型为 Oracle(默认无该项配置):

配置

这里的意思是:数据类型设置为 Oracle(在长期使用过程中,没有任何问题;DM 数据库的 Oracle 兼容性做的非常好,很多相关框架,都可以使用类似配置方式)

如果是使用了方言包,还需要注意修改方言包的类名,以及方言包的引用,配置方式如下:

datasource.driver=dm.jdbc.driver.DmDriver
datasource.url=jdbc:dm://localhost:5236
datasource.username=test
datasource.password=testcsdc1
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

上述类名只修改了连接串,还需要把最后一行修改为:hibernate.dialect= org.hibernate.dialect.DmDialect

JAVA 作为一个最通用的平台框架,其数据库无关性做的比较好,所有和 JAVA 相关的配置方式,最核心的就是下面这张图:

连接基础参数

DM 支持的 hibernate 版本

都支持,如遇不兼容的情况可在社区内向工作人员反馈,谢谢。

直接使用 DM 安装数据库后自带的 jar 包路径。

  • Linux 环境

包路径

Windows 环境

路径

总之,JAVA 作为一个最通用的平台框架,其数据库无关性做的比较好,所有和 JAVA 相关的配置方式,最核心的就是下面这张图:

img

IDEA 配置 DM 的数据库方言

配置步骤如下:

  • 根据自己环境,找到合适的 DM 的方言包,DM 方言包所在路径为安装路径下 drivers 文 件夹下。
  • 将方言包拷贝至项目指定路径下。
  • 点击 File-settings-Languages&Frameworks-SQL Dialects,如下图所示:

设置

  • 点击【添加】按钮,如下图所示:

添加

  • 添加刚才复制的方言包,点击【ok】。

添加方言包

  • 点击【apply】及【ok】完成方言包的添加。

应用完成

在 console 中执行以下语句,结果如下:

执行语句

JDK 包和驱动不匹配

错误提示:/driver dm.jdbc.driver.DmDriver is not sequoia compliant

错误提示如下图所示:

错误提示

【解决方法】

更换 JDK 包就可以了。连接池的连接问题:连接要使用 DM 安装数据库后自带的 JDK 包。

Windows 在安装目录的 ..\dmdbms\drivers\jdbc 下面有驱动。驱动分为 DmJdbcDriver16、DmJdbcDriver17,DmJdbcDriver18 分别对应 Jdk1.6、Jdk1.7; Jdk1.8;

Linux 环境下一般 jar 包都在 ../dmdbms/drivers/ 路径下:

路径目录

通过 dm_svc.conf 连接主备集群

dm_svc.conf 配置类似如下例子:

配置信息

JDBC 连接请查看《DM 程序员手册》(手册位于数据库安装路径 /dmdbms/doc 文件夹下),如下图所示:

连接串属性

注意

读写分离集群,MPP 集群都可以用这样的方法。

使用 JDBC 连接如何配置字符集

JDBC 加 characterEncoding=XX(字符集)或者在 dm_svc.conf 中配置。

DM 安装时生成一个配置文件 dm_svc.conf,不同的平台所在目录有所不同。

  • 32 位的 DM 安装在 Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;
  • 64 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\system32 目录;
  • 32 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\SysWOW64 目录;
  • 在 Linux 平台下,此文件位于 /etc 目录。

dm_svc.conf 文件中包含 DM 各接口及客户端需要配置的一些参数,具体的配置项如下:

配置项 缺省值 简述
CHAR_CODE 操作系统编码格式 客户端使用的编码格式,会影响帮助信息和错误提示信息,要与客户端使用的编码格式一致。支持的选项为:
PG_UTF8(表示 UTF8 编码);
PG_GBK/PG_GB18030(两者都表示 GBK 编码);
PG_BIG5(表示 BIG5 编码);
PG_ISO_8859_9(表示 ISO88599 编码);
PG_EUC_JP(表示 EUC_JP 编码);
PG_EUC_KR(表示 EUC_KR 编码);
PG_KOI8R(表示 KOI8R 编码);
PG_ISO_8859_1(表示 ISO_8859_1 编码)。
可以不指定,若不指定,系统会读取操作系统信息获得编码信息,建议有需要才指定。

DM 数据库支持的驱动

可以在 DM 数据库安装目录的 drivers 文件夹中查找相应的驱动版本进行使用。

目录

JDBC 驱动:

JDBC (Java Database Connectivity) 是 JAVA 应用程序与数据库的接口规范,旨在让各数据库开发商为 JAVA 程序员提供标准的数据库应用程序编程接口 (API)。 JDBC 定义了一个跨数据库、跨平台的通用 SQL 数据库 API。DM JDBC 驱动程序是 DM 数据库的 JDBC 驱动程序,它是一个能够支持基本 SQL 功能的通用应用程序编程接口,支持一般的 SQL 数据库访问。通过 JDBC 驱动程序,用户可以在应用程序中实现对 DM 数据库的连接与访问,JDBC 驱动程序的主要功能包括:

  • 建立与 DM 数据库的连接。
  • 转接发送 SQL 语句到数据库。
  • 处理并返回语句执行结果。

ODBC 驱动:

ODBC 提供访问不同类型的数据库的途径,结构化查询语言 SQL 是一种用来访问数据库的语言,通过使用 ODBC,应用程序能够使用相同的源代码和各种各样的数据库交互。这使得开发者不需要以特殊的数据库管理系统 DBMS 为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。DM ODBC 3.0 遵照 Microsoft ODBC 3.0 规范设计与开发,实现了 ODBC 应用程序与 DM 的互连接口。用户可以直接调用 DM ODBC 3.0 接口函数访问 DM,也可以使用可视化编程工具如 C++ Builder、PowerBuilder 等利用 DM ODBC 3.0 访问 DM。

在 DM 客户端软件安装过程中,如果选择了安装 ODBC 驱动程序的相关选项,安装工具可完成将 DM ODBC 3.0 驱动程序复制到硬盘,并在 Windows 注册表中登记 DM ODBC 驱动程序信息的工作。

备注

DM 数据库提供了多种数据库访问接口,相应开发环境的配置,以及一些开发用例,详细内容可参考《DM 程序员手册》(手册位于**数据库安装路径** `/dmdbms/doc` 文件夹下) 如果没找到原生的驱动,比如 Go/Peal,可以用 ODBC 驱动来替代。

tpc-c 标准测试工具

数据库厂商不提供测试工具,建议使用第三方测试工具。举例最常用的 BenchMarkSql 工具:

  • DM JDBC 驱动包放到 BenchMarkSql 的 lib 文件夹下,在工具 run 文件夹下复制一个 props 文件命名为 props.dm 并且进行编辑添加 DM 的连接串,举例如下:
driver=dm.jdbc.driver.DmDriver
conn=jdbc:dm://localhost:5236
user=benchmarksql
password=123456789
  • 创建相应的测试用户以及相关表的 SQL 脚本举例名称为 sqlTableCreates,执行 ./runSQL.sh props.dm sqlTableCreates 进行用户和表的创建。
  • 然后使用 ./runLoader.sh props.dm numWarehouses 200(200 表示要装载 200 个仓库)。
  • 对 DM 数据库的参数进行优化。
  • 用工具进行测试 ./runBenchmark.sh props.dm 查看结果集。

JDBC 驱动连接数据库 Error: for input String 8

需使用对应版本的 JDBC 驱动,可以在数据库安装目录 dmdbms8/drivers/jdbc 下找到对应的驱动包 DmJdbcDriver18.jar。如有其他问题,请在社区内咨询。

hibernate 连接数据库的方言写法

Hibernate.cfg.xml 配置要求:

  • 驱动名称
<property name="connection.driver_class">dm.jdbc.driver.DmDriver</property>
  • 方言包名称
<property name="dialect">org.hibernate.dialect.DmDialect</property>

举例:达梦数据库通过 hibernate 连接的基本程序配置

JDBC 如何通过服务名连接读写分离集群

SVC 使用说明:

  • dm_svc.conf 文件存放:
Linux:将 dm_svc.cof 文件放在应用服务器 /etc 目录下。
Windows 32 位:将 dm_svc.cof 文件放在应用服务器 system32 目录下。
Windows 64 位:将 dm_svc.cof 文件放在应用服务器 system32 和 syswow64 目录下。
  • 配置应用连接串:
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://GRP_RW1?rwSeparate=1&rwPercent=0</URL>
注意

dm_svc 文件不一定是在主机或备机上配置,而是在应用所在的机器上配置。 应用所在的机器上没有要求必须安装数据库,可以自己新建编辑一个 dm_svc 文件来使用。

连接尚未建立或者已经关闭

【问题描述】

使用的 DmJdbcDriver17 和 DmJdbcDriver18 程序启动后,提示连接尚未建立或者已经关闭--用户 DM 的 drivers 目录里面没有 JdbcDriver18。

【解决方法】

  1. 新版本 DM 数据库的安装目录里已经有 JDBCDRIVER18。
  2. 修改 dm.ini 里面的 max_sessions 参数。
  3. 检查是否用户设置了最大空闲时间参数,导致超时断开。
  4. 检查数据库服务器到应用服务器的网络波动,从应用服务器 ping 数据库服务器 -t,网络波动也会导致此报错。
  5. 检查连接池设置,是否设置了断开后自动连接。
  6. 若以上都没问题建议开启 JDBC 日志。出现报错后将生成的日志转发给服务部同事分析。

DM 支持 mybatis/mybatis-plus 吗

DM 数据库支持 mybatis/mybatis-plus。

语句句柄个数超上限 (1024) 或系统内存不足

【问题描述】

java.sql.SQLException: 语句句柄个数超上限 (1024) 或系统内存不足。

【问题原因】

不申请新的 session,不停地申请语句句柄,超过了每个 session 可用语句句柄数的上限。

【解决方法】

治本:修改应用程序,每个语句句柄用完后,将句柄关闭。

治标:修改 dm.ini 参数,提高 session 可用语句句柄的上限,比如:max_session_statement 由 100 改为 1000。

buffer index out of range

【问题描述】

用 DM 批量插入数据的时候插一条没问题,插入两条及以上的时候提示【buffer index out of range】的问题,用 tidb 数据库就没问题,需要如何处理?

【解决方法】

  • 可能是 JDBC 驱动不匹配,建议使用较新的驱动。
  • 换驱动后还有问题,可以尝试将 dm.ini 修改 BATCH_PARAM_OPT = 1 ,然后重启一下数据库服务。

如果还有问题,修改 JDBC 的 URL,开启 JDBC 的 log 日志辅助分析。

可参考:达梦数据库 JDBC 如何开启 log 日志

druid 报错:dbType not support

【问题描述】

16:01:02,007 ERROR main pool.DruidDataSource:983 - {dataSource-1} init error
java.lang.IllegalStateException: dbType not support : dm, url jdbc:dm://localhost:5236
at com.alibaba.druid.wall.WallFilter.init(WallFilter.java:167)

配置了 wall Filter(防火墙过滤),报异常:dbType not support

【解决方法】

去掉 wall 配置,对应配置文件里的把 fitter 的 wall 删掉。

警告

此方法禁止在生产环境用。

JAVA 更新 DM clob 或 blob 字段,提示无效的十六进制数字

关于大字段的更新,请参考《DM 程序员操作手册》—JDBC 相关章节。(手册位于数据库安装路径 /dmdbms/doc 文件夹下)

用 hibernate 执行 hql,参数为 null 的时候报错“无效的十六进制数据”

请从达梦云适配中心下载试用下载最新的达梦数据库,使用最新的驱动。

activiti 工作流是否支持达梦数据库

支持,可以参考如何让 Activiti 支持 DM7

Communication error "dm network timeout executor" Set network timeout error

具体请参考 Communication 通信错误问题分析

JAVA springboot 引入数据库的 jar 包,数据源监听到 SQL 已经执行,但没有返回值

注意在执行 SQL 语句后,要执行 commit; 进行提交。举例:

select "id","u_acount","u_password","u_kind","u_status" from "TEST"."table_user" limit 1;  
commit; //需要在 sql 里面提交

将查询结果赋值给变量

【问题描述】

select @aa=xh from XXX
像这种将查询结果赋值给变量 @aa 的情况,在达梦数据库中应该怎样写?

【解决方法】

select 列名 into 变量名 from 表名 where 条件;

jdbc 连接 DM 数据库时,是否可以使用 dm8 的驱动连接 dm7 的数据库

可以,但是最好使用用 DM8 的驱动去连 DM8,不建议用 DM7 的驱动去连 DM8。

存进去的数据与读取出来的数据不同

存入数据

读取数据

字段类型不同,请考虑使用用 text 或者 clob 数据类型。此问题是由于应用代码导致的问题,请检查相关的插入与查询代码。

JavaWeb 框架如何连接访问 DM 数据库

通用的写法如下:

// 定义 DM JDBC 驱动串
String jdbcString = "dm.jdbc.driver.DmDriver";
// 定义 DM URL 连接串
String urlString = "jdbc:dm://localhost:5236";
// 定义连接用户名
String userName = "SYSDBA";
// 定义连接用户口令
String password = "SYSDBA";

不同的 JavaWeb 框架根据不同连接池修改相应的连接字符。例如 C3P0 连接池连接达梦,配置信息如下:

… …
<property name="jdbcUrl" value=" dm.jdbc.driver.DmDriver" />
        <property name="driverClass" value=" jdbc:dm://192.168.1.1:5236" />
        <property name="user" value="SYSDBA" />
        <property name="password" value="SYSDBA" />

达梦数据库 JAVA 连接接口以及示例在程序员手册中有详细介绍,JDBC 框架:ssh,ssm,spring boot,spring cloud。

连接池:连接达梦和 Oracle 基本类似,就是 driver 名称和 url 不一样,走 JDBC 的,包括 sqlserver 和 MySQL 都差不多,就 driver 和 url 差异。

hibernate 配置主键默认、序列插入报错:违反非空约束

修改 hibernate 配置以及表主键属性为 identity。

可以参考:hibernate 使用序列作为主键在国产达梦数据库中的配置方法

JDBC 驱动连接数据库报错:failed to initialize ssl

由于未配置 SSL 环境而使用 SSL 登录,可以关闭 SSL 参数。使用 sysdba 登录执行以下语句:

SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0);

然后重启达梦数据库服务。

报错:Caused by: org.activiti.engine.

ActivitiException: couldn't deduct database type from database product name 'DM DBMS'

请参考:activiti 连接 DM 数据库报错

在驱动 URL 里面添加扩展连接属性 comOra=true, 例如:jdbc:dm://localhost:5236?comOra=true

如何回收空闲会话

【问题描述】:

连接一直报错:reached the max session limit,调整 MAX_SESSSIONS 参数无效,如何回收空闲会话。

【问题解答】:

依据不同的编程接口,调用相应的关闭会话的函数。

服务器上关闭会话的函数是 sp_close_session(sess_id) 。原则上禁止开发人员直接在服务器端关闭会话,请开发人员在使用完会话后自觉关闭会话。若有需要在服务器端关闭会话请数据库管理员 DBA 操作。

jdbc 连接数据库查询的时间与客户端连接查询的时间相差 8 个小时

检查数据库服务器/应用服务器 /JDBC 连接串属性 /dm_svc.conf 中的时区设置。若确认都设置正确,建议申请一线技术支持。

Druid 报错:unkow jdbc driver

【报错详情】:

16:16:50,872 ERROR main pool.DruidDataSource:658 - dataSource init error
java.sql.SQLException: unkow jdbc driver : jdbc:dm://localhost:5236
at com.alibaba.druid.util.JdbcUtils.getDriverClassName(JdbcUtils.java:416)

【问题解决】:

是因为 Druid 1.0.11 及以前版本,不能省略 driverClassName 参数否则出现 unkow jdbc driver 异常,请升级到最新版,如 Druid 1.1.20(推荐)或 配置 driverClassName=dm.jdbc.driver.DmDriver 。

德鲁伊(druids)连接池相关配置

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="filters" value="stat,log4j" />
</bean>

Druid 连接达梦报错

【报错信息】:

com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10003, active 326, runningSqlCount 254

【问题解答】:

  1. 升级 Druid 到最新版本。
  2. 修改数据库实例里面配置文件 dm.ini 文件里面的 MAX_session 的参数,值适当调大。

应用 jdbc 链接数据库失败问题/连接超时

  1. 首先让验证 isql 连接性,其次排查 MAX_SESSIONS 的最大值设置
    备注:MAX_SESSIONS 参数在安装目录的 dm.ini 文件里。
  2. 如果都没问题在 jdbc 连接串里设置 socketTimeout,套接字超时时间。
  3. 如果还是不行,尝试更换 jar 包。

dbc 执行 explain 语句,resultset 是空的。用了 explain for,resutset 还是空的

用 rowset 来执行 explain for 语句。

在进行连接池测试时,报错“java.lang.ClassNotFoundException”

  1. DM 的 JDBC 驱动没有放置在正确的路径下;
  2. DM 的 JDBC 驱动的类名写错了。

DM Hibernate 方言包兼容 Oracle 和 MySQL 的主键生成策略

Hibernate 主键生成策略

达梦数据库如何防止 SQL 注入?

推荐应用人员在写 SQL 语句时,使用 SQL 语句参数化绑定。

JAVA 程序指定访问模式

【问题说明】
数据库一个用户下存在多个模式,JAVA 程序访问登录的数据库用户下非默认模式下的对象时,不在 SQL 中添加"模式名.对象名"的方式来访问数据的方法

【解决方法】
使用较新版本的达梦 JDBC 驱动(比如 2021 年 4 月之后的驱动),可以在 JDBC 连接串中指定 schema 属性,配置 schema=模式名 1,来指定用户登录后的当前模式。默认不配置 schema 属性表示使用默认模式。
举例说明:
数据库用户 TEST 下有两个模式 TEST 和 TEST1,其中 TEST 为默认模式。JDBC 中指定 TEST 登录后的当前模式为 TEST1,配置如下:

String name="dm.jdbc.driver.DmDriver";
String url="jdbc:dm://192.168.15.35:5236?schema=TEST2";     //使用schema指定当前模式名
String user="TEST";
String password="123456789";

这样使用 TEST 用户登录后,就可以不需要在表名前加上模式名 TEST2。

JAVA 程序使用 SSL 认证连接数据库报错

报错信息:

javax.net.ssl.SSLException: Received fatal alert: protocol_version

【问题说明】
可能是 dm JDBC 驱动包版本不对或者比较低
【解决方法】
更换对应达梦数据库版本的 JDBC 驱动包

开启 ssl 认证后连接数据库报错:网络通讯异常

【问题说明】

开启 ssl 认证后,应用无法连接数据库,提示网络通讯异常,用 DM 管理工具可以正常连接,将应用的 jdk 更换为达梦自带 jdk 也可以正常连接。

【问题解决】

该问题是由于应用所使用的 jdk 中 jdk\jre\lib\security\java.security 配置文件差异导致,一般较高版本的 jdk 可能存在该问题。
存在该问题的情况下,可以查看 java.security 配置文件,删除 TLSv1 即可。

修改 java.security 配置文件

定时任务中适配 quartz blob 字段不支持的处理

【问题描述】

具体报错信息为:
org.quartz.JobPersistenceException: Couldn't store job: Driver's Blob representation is of an unsupported type: dm.jdbc.driver.DmdbBlob [See nested exception: java.sql.SQLException: Driver's Blob representation is of an unsupported type: dm.jdbc.driver.DmdbBlob]

【问题解决】

需要将 quartz.properties 配置文件的
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
改为
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

注意

org.quartz.jobStore.driverDelegateClass 中的 driver 代表了解不同数据库系统的特定“方言”。可能的选择包括: org.quartz.impl.jdbcjobstore.StdJDBCDelegate(用于完全符合 JDBC 的驱动程序) org.quartz.impl.jdbcjobstore.MSSQLDelegate(对于 Microsoft SQL Server 和 Sybase) org.quartz.impl.jdbcjobstore.WebLogicDelegate(对于 WebLogic 驱动程序) org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate(对于 Weblogic 中使用的 Oracle 驱动程序) org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate(对于在 Weblogic 中使用的 Oracle 驱动程序) org.quartz.impl.jdbcjobstore.PostgreSQLDelegate org.quartz.impl.jdbcjobstore.oracle.OracleDelegate org.quartz.impl.jdbcjobstore.CloudscapeDelegate org.quartz.impl.jdbcjobstore.DB2v6Delegate org.quartz.impl.jdbcjobstore.DB2v7Delegate org.quartz.impl.jdbcjobstore.DB2v8Delegate org.quartz.impl.jdbcjobstore.HSQLDBDelegate org.quartz.impl.jdbcjobstore.PointbaseDelegate org.quartz.impl.jdbcjobstore.SybaseDelegate

jdbc 程序中如何获取存储过程的元数据信息

【问题描述】

利用如下程序获取存储过程的元数据信息,执行完后获取的元数据信息为空,jdbc 程序代码片段如下:

 DatabaseMetaData dbMetaData = conn.getMetaData();
   ResultSet rs = dbMetaData.getProcedureColumns("PERSONPACKAGE", dbMetaData.getUserName(), "ADDPERSON", null);
   ResultSet rs = dbMetaData.getProcedureColumns("PERSONPACKAGE", dbMetaData.getUserName(), "ADDPERSON", null);
    System.out.println("Get getProcedureColumns:");
     while (rs.next()) {
      System.out.println("PROCEDURE_NAME:"+rs.getString("PROCEDURE_NAME"));
     System.out.println("COLUMN_NAME:"+rs.getString("COLUMN_NAME"));
              }

【问题解决】

需要 JDBC 打开兼容 Oracle 模式,在 jdbc 的 url 串中添加 compatibleMode=oracle。
例如:jdbc:dm//localhost:5236?compatibleMode=oracle

JDBC 中使用 setNull 方法给 varchar 类型绑定空值报错:字符串转换出错

【问题描述】
通过如下语句给 varchar 类型绑定空值报错:字符转换出错

   String sql = "select * from sysobjects where name=?";
   PreparedStatement stmt = conn.prepareStatement(sql);
   stmt.setNull(1, 0);
   stmt.execute();
   conn.commit();

【问题解决】

出现该报错是由于达梦默认 null 和空串不等价,解决办法:

  1. 修改 dm.ini,令 COMPATIBLE_MODE = 2;
  2. 重启数据库服务后生效。

activiti 工作流因大小写敏感问题导致工作流引擎报错引发异常

【问题描述】

activiti 工作流 5.23 在适配达梦数据库时,如果 DM 初始化实例时设置参数大小写敏感,在通过工作流引擎写入 act_ru_variable 表的 NAME_字段值时,该字段以大写值 SYS_ORG_CODE 插入表中,但在工作流引擎以该字段作为查询条件进行结果集的查询过滤时,以小写值 sys_org_code 进行结果集过滤查询,这样会导致查询不到对应结果集而导致工作流引擎报错引发异常。

【问题解决】

为解决该问题,就需要手动的控制工作流引擎在写入该字段时必须以小写值的形式写入,这样在查询的时候以小写的形式查询过滤,便可获得正确的结果集,从而避免写入数据库中的值和查询过滤条件值大小写形式不一致的情况发生。
在 ActivitiController.java 类指定位置增加以下两行代码,把 NAME_字段的值替换为小写的形式,通过手动限定 taskVariables 里面指定变量的值为小写,在执行 this.taskService.complete(taskid,taskVariables);值写入时,把 NAME_字段的值以小写的形式写入到数据库中。如下图所示:

NAME_字段值替换为小写

修改后,重新验证工作流程是否可以正常流转,发现工作流引擎写入 NAME_字段的值为小写,整个工作流程可以正常的流转起来。

修改后运行正常

使用 DM8 的 JDBC 驱动连接 DM7 数据库,报错:“网络通信异常”和“拒绝连接”

【问题描述】

应用使用 DM8 的 JDBC 驱动连接 DM7 数据库,但是报达梦 jdbc 驱动 “网络通信异常”和“拒绝连接”错误,无法连接数据库。报错信息如下:
WARN [main] (c.d.dms.metadata.database.JdbcDataSource):72 -数据源连接失败: 网络通信异常: 拒绝连接 (Connection refused)
com.dameng.dms.framework.exception.SystemException: 网络通信异常: 拒绝连接 (Connection refused)
Caused by: dm.jdbc.driver.DMException: 网络通信异常

【问题解决】

按以下步骤进行排查:
1.确认本地数据库服务启动,本地 disql 可以登录,从应用服务器可以登录;
2.确认数据库版本和替换对应版本的 jdbc 驱动版本测试;
3.测试调试应用,是否属于应用问题。
例如:可能是应用设置了防火墙,未打开需要的端口(8087)等原因。解决办法是打开防火墙相应的端口:

systemctl status firewalld.service
firewall-cmd --list-all
firewall-cmd --zone=public --add-port=8087/tcp --permanent
firewall-cmd --list-all
firewall-cmd --reload
firewall-cmd --list-all

Springboot 使用 druid 链接池时报错:testWhileIdle is true, validationQuery not set

【问题描述】

报错截图如下图所示:

报错截图

【问题解决】

引起该报错的主要原因是没有设置 SQL 语句测试链接数据库的可用信造成的。在配置文件添加如下配置可以解决该问题:

报错截图

应用 sql 语句中 select 中别名为小写字母时,如何在查询结果中自动转换为大写字母

【问题描述】

应用 sql 语句中 select 中别名为小写字母时,查询结果别名为小写字母,并非和 oracle 一样自动转换为大写字母。

如下图所示,DM 数据库中 dict_code 字段查询结果别名为小写,在 Oracle 中查询结果自动转换为大写。

DM 数据库执行结果

【问题解决】

增加 jdbc 连接参数 columnNameUpperCase=true 可实现返回结果为大写字母的需求。
columnNameUpperCase:列名转换为大写字母;取值 1/0 或 true/false;默认 false。

mybatis 框架和 DM8 框架整合时报错:dm.jdbc.driver.DMException

【问题描述】

mybatis 框架和 DM8 框架整合时报错:dm.jdbc.driver.DMException。截图如下:

报错截图

【问题解决】

出现原因:开发人员在 mybatis 框架的 xml 文件的 <select><update><delete> 标签中编写 sql 语句时 使用--注释 sql 语句,导致 jdbc 驱动执行 sql 会报序列号无效。
解决方法:去掉无效的注释语句即可。

mybatis-plus 整合达梦时,自动生成的 sql 语句报错

【问题描述】

mybatis-plus 整合达梦时,应用系统项目的 sql 语句中包含数据库关键字,导致 mybatis-plus 自动生成的 sql 语句会报错,如下图所示:

报错截图

【问题解决】

问题原因:mybatis-plus 生成的 sql 语句字段是小写的,同时还包含数据库关键字。框架会默认加上(`)符号,该符号在达梦数据库中无法被识别,需要更换为 (")。
有如下两种解决方案:
方案一:在实体类中的字段添加 TableField 注解:

@TableField(““type””)
private int type;

方案二:修改实体类的字段名称避免使用达梦数据库关键字。

执行 SQL 语句,驱动返回层报错:变量空间溢出

【问题描述】

当一条 SQL 涉及批量绑定参数个数较多时,JDBC 驱动层返回报错,“变量空间溢出”。且 SQL 日志里接收到对应的 sql,没有解析,直接 rollback。报错截图如下:

报错截图

【问题解决】

可适当调整数据库 dm.ini 里 VM_STACK_SIZE 参数。默认为 256,单位为 KB。例如当批量绑定参数个数达到 30000 时,可将 VM_STACK_SIZE 调整为 5120。
说明:VM_STACK_SIZE:系统执行时虚拟机堆栈大小,单位为 K,堆栈的空间是从操作系统中申请的,有效值范围(64~256*1024)。该参数为静态参数,修改后重启数据库生效。

微信扫码
分享文档
扫一扫
联系客服