报错【未经授权的用户】的原因

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

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

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

DM 支持 C3P0 连接池

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

  1. 添加依赖

  1. 添加 JDBC 驱动

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

  1. 创建 DataSourceConfig 类

  1. 编写测试代码

  2. 实体类

  1. XML 映射文件

  1. Controller

  1. 执行结果

如何连接 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 连接串写法如下:

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 相关的配置方式,最核心的就是下面这张图:

IDEA 配置 DM 的数据库方言

配置步骤如下:

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

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

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

  1. 点击【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 工具:

  1. DM JDBC 驱动包放到 BenchMarkSql 的 lib 文件夹下,在工具 run 文件夹下复制一个 props 文件命名为 props.dm 并且进行编辑添加 DM 的连接串,举例如下:
driver=dm.jdbc.driver.DmDriver
conn=jdbc:dm://localhost:5236
user=benchmarksql
password=123456789
  1. 创建相应的测试用户以及相关表的 SQL 脚本举例名称为 sqlTableCreates,执行 ./runSQL.sh props.dm sqlTableCreates 进行用户和表的创建。

  2. 然后使用 ./runLoader.sh props.dm numWarehouses 200(200 表示要装载 200 个仓库)。

  3. 对 DM 数据库的参数进行优化。

  4. 用工具进行测试 ./runBenchmark.sh props.dm 查看结果集。

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

可以加入达梦官方技术 QQ 群:1139926252,在群文件里下载需最新的 JDBC 驱动解决该问题。

hibernate 连接数据库的方言写法

Hibernate.cfg.xml 配置要求:

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

举例:达梦数据库通过hibernate连接的基本程序配置_dmdba1的博客-CSDN博客_hibernate 达梦数据库

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

SVC 使用说明:

  1. dm_svc.conf 文件存放:
linux:将 dm_svc.cof 文件放在应用服务器 /etc 目录下。
Windows 32 位:将 dm_svc.cof 文件放在应用服务器 system32 目录下。
Windows 64 位:将 dm_svc.cof 文件放在应用服务器 system32 和 syswow64 目录下。
  1. 配置应用连接串:
<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日志?_myth8860的博客-CSDN博客

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 文件夹下)

原文作者:墨天轮

转载地址:DM8达梦数据库JAVA常见问题 - 墨天轮达梦数据库DM8常见问题->JAVAhttps://cdn.modb.pro/db/34537

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐