人大金仓使用记录

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('序列名称')

 

 

 

posted @ 2024-01-15 13:45  sensen~||^_^|||&  阅读(952)  评论(0编辑  收藏  举报