人大金仓使用记录
1.人大金仓指定模式:######
情况1===>:
如果不存在和当前连接用户同名的模式,则默认访问public模式, 如果不是用户希望访问的模式,则需要在表名称前加模式名访问:
eg: localhost:54321/test?currentSchema=schematest 可以指定默认模式。
如果是自建的sys_user表和系统的sys_user同名了,即使加了currentSchema指定模式,但是kingbase还是去找系统的sys_user表了,还是需要在表名前加模式名。解决:
localhost:54321/mydatabase?currentSchema=myschema,SYS_CATALOG
情况2===>:
有时候上面情况一的配置还是连接不到数据库模式,尝试下面的方式:
url: jdbc:kingbase8://1.1.2.5:9180/dataName?currentSchema=dataName,productName=PostgreSQL,SYS_CATALOG,PUBLIC
eg:
url: jdbc:kingbase8://127.0.0.1:54321/test?currentSchema=testSchema,productName=PostgreSQL,SYS_CATALOG,PUBLIC&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&createDatabaseIfNotExist=true&SSL=false&nullCatalogMeansCurrent=true
改成这样试一试。
如果用到了jpa,jpa的配置中最好也加上指定模式声明:
下面配置中的 default_schema 要改成自己的模式:
jpa:
hibernate:
ddl-auto: update
show-sql: true
# database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
properties:
hibernate:
format_sql: true
temp:
event:
merge:
entity_copy_observer: allow
use_jdbc_metadata_defaults: false
dialect: org.hibernate.dialect.Kingbase8Dialect
default_schema: testSchema
hbm2ddl:
auto: update
show_sql: true
database: oracle
2.报错:######
com.kingbase8.util.KSQLException: 致命错误: 对不起, 已经有太多的客户
原因:
连接不够用了。
解决:
-- 查看当前的连接情况,查询sql如下:
select * from pg_stat_activity;
-- kill掉处于空闲状态的连接
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state='idle';
3.报错:######
Encountered a duplicated sql alias [case] during auto-discovery of a native-sql query
原因:
出现这个问题的原因是你查询的字段有重名,hibernate无法映射字段,在mysql中能成功执行,但是hibernate中不行
解决:
将重名的字段其中一个字段取个别名就可以避免这种情况。
4.报错:######
字段 "T.id" 必须出现在 GROUP BY 子句中或者在聚合函数中使用。
原因:
PG的分组函数是比较严格的,你select的字段必须得存在于group子句、或者聚合函数中才行。
解决:
方法1:给所有的字段全部加上一个 max() 函数。
eg:select max(name) as name...
方法2:Window function(窗口函数) + distinct 去重。
窗口函数语法:聚合函数(sum,min,avg……) + OVER ( …… )
窗口函数会将计算出来的结果带回到计算行上,直接一个普通查询,不GROUP了,我们想要的class就可以查出来了,然后用窗口函数去算我需要聚合的数据,这里直接写上关键字OVER放在avg(score)后面, 然后括号里跟上一个PARTITION BY name, 意思就是按照name去分组,把结果计算出来,但是行数没有变,再通过distinct函数,指定 PARTITION BY 的那个字段,也就是name,OVER 后面的括号里可以什么都不填,那样子就是所有数据都会经过此窗口计算。
eg:SELECT distinct on (name)
name,
class,
avg(score) OVER (PARTITION BY name) AS score,
FROM table
方法3:在子查询中完成聚合,然后关联包含需要显示字段的表。
eg: 原sql:
SELECT
ID,
tenant_id,
remarks,
SOURCE,
create_user,
create_time,
update_user,
update_time,
work_source,
platform_no
FROM
work_base
GROUP BY
work_source
修改后:
SELECT
t.ID,
t.tenant_id,
t.remarks,
t.SOURCE,
t.create_user,
t.create_time,
t.update_user,
t.update_time,
t.work_source
FROM (
SELECT work_source
FROM
work_base
WHERE
work_source IS NOT NULL
GROUP BY
work_base
) t LEFT JOIN work_base wb ON t.work_source= wb.work_source
方法4:连表/子查询:
可以把group by的结果集当作一个表,然后从这里表里取数就可以了
例如:查询,订单表中订单号重复的订单信息,分组字段是orderno,select的信息不仅有orderno,还有其他信息
SELECT
p.id,
p.orgcode,
p.idserial,
p.username,
p.orderno,
p.createtime,
p.payflag,
p.businessorderno,
p.paytime
FROM
pay_order_trade p,
(
SELECT
orderno,
count(*) 重复次数
FROM
pay_order_trade
GROUP BY
orderno
HAVING
count(1) > 1
) s
WHERE
s.orderno = p.orderno
ORDER BY
p.orderno DESC;
5. 报错:######
已保留的连接位置为执行非复制请求的超级用户预留...
原因:
角色权限不够。
解决
创建和数据库模式一样名称的角色,并赋予其所有最高权限试一试。
6. 问题:######
人大金仓整合Springboot和activiti工作流成功生成表结构后,新建一个数据库后启动项目并连接该数据库后 activiti 就再也生成不了那42张表结构了,并且启动报错:
eg:“Could not get property from table ACT_ID_PROPERTY com.kingbase8.util.KSQLException: 错误: 关系 "ACT_ID_PROPERTY" 不存在..."
原因:
有可能是pg数据库会扫描所有有权限查看的库或模块来找表,如果其他库或模块中有相同名称的表,activiti就以为找到了,本质上这个表在当前数据库中并不存在,最后因为在本库中不存在,又有对不存在表的操作,所以就会报找不到表的异常。从错误上来看,是activiti查询的时候,"串库"了,认为自己库里已经有activiti的表了,所以执行插入等操作会报错。而实际上这些表是在别的库或模块里。
解决:
(1)首先尝试在数据库连接地址后面添加配置:nullCatalogMeansCurrent=true
当nullCatalogMeansCurrent为 false 时,mysql驱动会遍历当前链接的所有表,执行以下语句,判断是否存在Activiti表,这样就会出现文章开头所讲的“串库”的效果;如果nullCatalogMeansCurrent为true,则使用指定的数据库来执行查询语句,不会遍历。
参考:https://blog.csdn.net/jiaoshaoping/article/details/80748065
总结:true 使用指定的数据库进行查询。优先取当前传入的数据库名,其次取当前链接的数据库名。
(2)如果按照方法1操作后还是没有生成工作流表结构,可以进行以下操作:
找到并删除掉其他存在activiti工作流自动生成的表结构,这样项目启动就不会从其他库或模式中找到那些表,就会自己新建了。如果其他的数据库不能删除,可以尝试修改PG数据角色的数据库访问权限,尝试缩小其访问权限,让它只能在某一个数据库中访问或操作即可。
通过以上修改基本上就能正常生成表结构了,如果在生成表的时候报以下错:
“create sequence act_hi_task_evt_log_seq start with 1 increment by 1...” 或者 “create sequence act_evt_log_seq...”等,在项目中找到报错的sql语句,注释掉后再执行就能正常生成表结构了。
7.人大金仓大小写:
问题:查询人大金仓数据库时报错找不到某字段:
原因:① 查询的表名与人大金仓自带表冲突,修改名称即可。
② 数据库中的字段名称有大写的,改成小写即可。
其中原因②可以在安装人大金仓数据库时避免:即在安装数据库时选择大小写不敏感就可以了,对于已经安装过的且已经选择了大小写敏感的,可以选择重新安装数据库配置为大小写不敏感。可以在网上找有没有不用重新安装也可以修改的方法(windows版的,我没有找到,也没有太多时间和精力去找,所以最终选择重新安装并选择大小写不敏感)就好了。
人大金仓查询是否大小写敏感sql语句:
V8R3 版本:
show case_sensitive;
如果是 on 表示是大小写敏感的。
V8R6 版本:
show enable_ci;
如果是 off 表示是大小写敏感的。
8. 人大金仓表设置自增:
①选择模式 --> ②点击序列 --> ③右键创建适合的序列 --> ④执行设置主键自增的sql即可:
eg: alter table "your table name" alter column id set default nextval('序列名称')