DM8达梦数据库JAVA常见问题
报错【未经授权的用户】的原因使用 druid 做连接池,在连接 DM 数据库时提示【未经授权的用户】有两种原因:在 DM 管理工具中,此用户的资源限制中【会话持续期】进行了限制,把此限制取消即可。连接池中的会话满了或者空会话未回收等原因造成用户无法连接。DM 支持 C3P0 连接池参考下面的 SpringBoot 集成 MyBatis 与 C3P0 连接池例子:添加依赖添加 JDBC 驱动通过
报错【未经授权的用户】的原因
使用 druid 做连接池,在连接 DM 数据库时提示【未经授权的用户】有两种原因:
- 在 DM 管理工具中,此用户的资源限制中【会话持续期】进行了限制,把此限制取消即可。
- 连接池中的会话满了或者空会话未回收等原因造成用户无法连接。
DM 支持 C3P0 连接池
参考下面的 SpringBoot 集成 MyBatis 与 C3P0 连接池例子:
- 添加依赖
-
添加 JDBC 驱动
-
通过 application.properties 配置文件配置数据源
- 创建 DataSourceConfig 类
-
编写测试代码
-
实体类
- XML 映射文件
- 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 连接串写法如下:
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 的数据库方言
配置步骤如下:
- 根据自己环境,找到合适的 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
可以加入达梦官方技术 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 使用说明:
- 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。
【解决方法】:
- 新版本 DM 数据库的安装目录里已经有 JDBCDRIVER18。
- 修改 dm.ini 里面的 max_sessions 参数。
- 检查是否用户设置了最大空闲时间参数,导致超时断开。
- 检查数据库服务器到应用服务器的网络波动,从应用服务器 ping 数据库服务器 -t,网络波动也会导致此报错。
- 检查连接池设置,是否设置了断开后自动连接。
- 若以上都没问题建议开启 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
更多推荐
所有评论(0)