查看: 3264|回复: 6

后端数据库从mysql换成postgresql时出现重复键违反唯一约束

升级   2.06%

10

主题

20

回帖

206

积分

注册会员

Rank: 2

积分
206
发表于 2024-1-29 19:14:16 | 显示全部楼层 |阅读模式
本帖最后由 hppys 于 2024-1-30 10:06 编辑

后端数据库从mysql换成postgresql时出现如下错误,数据库是初始数据库,就只是刚搭建初始OA:


Caused by: <openjpa-3.2.2-re5933d6 fatal store error> org.apache.openjpa.persistence.RollbackException: The transaction has been rolled back.  See the nested exceptions for details on the errors that occurred.
FailedObject: com.x.program.center.core.entity.ScheduleLog@16499421
        at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:713)
        at com.x.base.core.container.EntityManagerContainer.commit(EntityManagerContainer.java:1125)
        ... 5 more
Caused by: <openjpa-3.2.2-re5933d6 fatal store error> org.apache.openjpa.persistence.EntityExistsException: The transaction has been rolled back.  See the nested exceptions for details on the errors that occurred.
FailedObject: com.x.program.center.core.entity.ScheduleLog@16499421
        at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2475)
        at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2310)
        at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2201)
        at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2118)
        at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:84)
        at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1603)
        at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:1035)
        at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:690)
        ... 6 more
Caused by: <openjpa-3.2.2-re5933d6 fatal store error> org.apache.openjpa.persistence.EntityExistsException: 错误: 重复键违反唯一约束"cte_schedulelog_pkey"
  详细:键值"(xid)=(807730e1-224f-4b62-8756-6e698d82891d)" 已经存在 {prepstmnt 987951835 INSERT INTO public.CTE_SCHEDULELOG (xid, xcreateTime, xsequence, xupdateTime, xdistributeFactor, xapplication, xclassName, xelapsed, xfireTime, xnode, xstackTrace, xsuccess, xtype) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} [code=0, state=23505]
FailedObject: com.x.program.center.core.entity.ScheduleLog@16499421
        at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:5311)
        at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:5286)
        at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:134)
        at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:75)
        at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:146)
        at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:80)
        at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:102)
        at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:90)
        at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:555)
        at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:109)
        at org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:61)
        at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:109)
        at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:81)
        at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:755)
        at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:146)

我externalStorageSources.json配置文件如下

[
        {
                "url":"jdbc:postgresql://192.168.60.36:5432/Y",
                "username" : "postgres",
                "password" :"123546",
                "schema": "public",
                "includes": [],
                "excludes": [],
                "enable" : true
        }
]

是哪里重复写入吗
回复

使用道具 举报

升级   100%

139

主题

1万

回帖

4万

积分

超级版主

Rank: 8Rank: 8

积分
41458
发表于 2024-1-30 10:38:54 | 显示全部楼层
您的数据怎么迁移的?
回复

使用道具 举报

升级   2.06%

10

主题

20

回帖

206

积分

注册会员

Rank: 2

积分
206
发表于 2024-1-30 10:53:33 | 显示全部楼层
本帖最后由 hppys 于 2024-1-30 11:00 编辑
论坛管理员 发表于 2024-1-30 10:38
您的数据怎么迁移的?

我数据还没有开始迁移,就只是单纯把连接mysql换成posygresql连接,postgresql数据库我是新建一个Y库,然后就出现上面那问题,目前就是刚开始搭建,就只是用postgresql作为后端数据库,然后OA做一个集群,三台OA分别连接后端postgresql数据库,现状就是一台主机会出现上面错误,其他主机不会,当我把那出现错误主机关掉时,这个错误会出现在另一台主机,然后我开启被关掉那台主机,这个错误就会重新出现在第一台主机,然后这台主机就不会出现这个错误。
回复

使用道具 举报

升级   100%

0

主题

662

回帖

2

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2
发表于 2024-2-2 09:43:04 | 显示全部楼层
你确定集群配置下每个node_xxxx.json中的center下的order值都是不一样的,参照平台集群配置规范
回复

使用道具 举报

升级   2.06%

10

主题

20

回帖

206

积分

注册会员

Rank: 2

积分
206
发表于 2024-2-2 14:43:39 | 显示全部楼层
本帖最后由 hppys 于 2024-2-2 16:00 编辑

"order": 1.0,
"order": 2.0,
"order": 3.0,
我在OA集群里面order配置都是加一,是不一样,是不是因为我用postgresql时,是通过中间件pgpool访问,我现在是连接pgpool中间件的IP和端口。
回复

使用道具 举报

升级   100%

0

主题

662

回帖

2

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2
发表于 2024-2-4 11:28:49 | 显示全部楼层
如果三台都起着,出现问题的是order值为多少的节点报错?另外截图下order为1的config目录下所有配置
回复

使用道具 举报

升级   2.06%

10

主题

20

回帖

206

积分

注册会员

Rank: 2

积分
206
发表于 2024-2-4 16:52:56 | 显示全部楼层
启蒙星 发表于 2024-2-4 11:28
如果三台都起着,出现问题的是order值为多少的节点报错?另外截图下order为1的config目录下所有配置 ...

出现问题第一个是在order: '1'中,停掉这台主机,这个问题就会出现在order: '2'中
下面这个配置是order为1时的config配置:
{
  "enable": true,
  "center": {
    "enable": true,
    "order": 1.0,
    "sslEnable": false,
    "port": 8080.0,
    "httpProtocol": "",
    "proxyHost": "192.168.60.30",
    "proxyPort": 8081.0,
    "###enable": "是否启用###",
    "###order": "center节点顺序,顺序排列0,1,2...###",
    "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
    "###port": "端口,center服务器端口,默认20030###",
    "###httpProtocol": "对外http访问协议,http/https###",
    "###proxyHost": "代理主机,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问地址.###",
    "###proxyPort": "代理端口,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问端口.###",
    "###extension": "扩展设置.###"
  },
  "application": {
    "enable": true,
    "port": 8080.0,
    "sslEnable": false,
    "proxyHost": "192.168.60.30",
    "proxyPort": 8081.0,
    "includes": [],
    "excludes": [],
    "###enable": "是否启用###",
    "###port": "http/https端口,负责向前端提供数据访问接口.默认为20020端口.###",
    "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
    "###proxyHost": "代理主机,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问地址.###",
    "###proxyPort": "代理端口,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问端口.###",
    "###includes": "承载的应用,在集群环境下可以选择仅承载部分应用以降低服务器负载,可以使用*作为通配符.###",
    "###excludes": "选择不承载的应用,和includes的值配合使用可以选择或者排除承载的应用,可以使用*作为通配符.###",
    "###extension": "扩展设置.###"
  },
  "web": {
    "enable": true,
    "port": 8080.0,
    "sslEnable": false,
    "proxyHost": "",
    "proxyPort": 8081.0,
    "proxyCenterEnable": true,
    "proxyApplicationEnable": true,
    "proxyTimeOut": 300.0,
    "###enable": "是否启用###",
    "###port": "http/https端口,用户输入网址后实际访问的第一个端口.http协议默认为8080端口,https默认为443端口.###",
    "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
    "###proxyHost": "代理主机,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问地址.###",
    "###proxyPort": "代理端口,当服务器是通过apache/nginx等代理服务器映射到公网或者通过路由器做端口映射,在这样的情况下需要设置此地址以标明公网访问端口.###",
    "###proxyCenterEnable": "是否启用center服务器代理.###",
    "###proxyApplicationEnable": "是否启用application服务器代理###",
    "###proxyTimeOut": "代理连接超时时间,默认300(秒)###",
    "###extension": "扩展设置.###"
  },
  "data": {
    "enable": false,
    "tcpPort": 20050.0,
    "includes": [],
    "excludes": [],
    "jmxEnable": false,
    "cacheSize": 512.0,
    "logLevel": "WARN",
    "maxTotal": 50.0,
    "maxIdle": 0.0,
    "statEnable": false,
    "statFilter": "mergeStat",
    "slowSqlMillis": 3000.0,
    "lockTimeout": 120000.0,
    "###enable": "是否启用,如果没有可用的externalDataSources.json文件,那么默认会在节点中启用本地的H2数据库作为默认的数据库.###",
    "###tcpPort": "H2数据库jdbc连接端口,登录的用户名:sa,密码为xadmin的密码.数据库创建在/o2server/local/repository/data/X.mv.db,一旦数据库文件被创建,那么该数据库的密码被创建.###",
    "###webPort": "H2数据库web端口,H2提供一个web端的client,此端口为web端client的访问端口.用户名sa,密码为xadmin数据库初始创建的密码.###",
    "###includes": "设置此数据库存储的类,默认情况下存储所有类型,如果需要对每个类进行单独的控制以达到高性能,可以将不同的类存储到不同的节点上提高性能.可以使用通配符*###",
    "###excludes": "在此节点上不存储的类,和includes一起设置实际存储的类,可以使用通配符*###",
    "###jmxEnable": "是否启动jmx,如果启用,可以通过本地的jmx客户端进行访问,不支持远程jmx客户端.###",
    "###cacheSize": "H2数据库缓存大小,设置H2用于作为缓存的内存大小,以M作为单位,这里默认为512M.###",
    "###logLevel": "默认日志级别,FATAL, ERROR, WARN, INFO, TRACE. 完整的配置为DefaultLevel\u003dWARN, Tool\u003dTRACE, Enhance\u003dTRACE, METADATA\u003dTRACE, Runtime\u003dTRACE, Query\u003dTRACE, DataCache\u003dTRACE, JDBC\u003dTRACE, SQL\u003dTRACE###",
    "###maxTotal": "最大使用连接数###",
    "###maxIdle": "最大空闲连接数###",
    "###statEnable": "启用统计,默认关闭###",
    "###statFilter": "统计方式配置,默认mergeStat###",
    "###slowSqlMillis": "执行缓慢sql毫秒数,默认2000毫秒,执行缓慢的sql将被单独记录.###",
    "###lockTimeout": "默认锁超时时间()毫秒).###",
    "###extension": "扩展设置.###"
  },
  "storage": {
    "enable": false,
    "port": 20040.0,
    "sslEnable": false,
    "name": "251",
    "prefix": "",
    "deepPath": false,
    "###enable": "是否启用,对于二进制流文件,比如附件,图片等存储在单独的文件服务器中,可以支持多种文件服务器,默认情况下使用ftp服务器作为文件服务器,每个节点可以启动一个文件服务器以提供高性能.###",
    "###port": "ftp服务器端口,此端口可以不对外开放,仅有ApplicationServer进行访问,并不直接对用户提供服务.###",
    "###sslEnable": "是否启用ssl传输加密,如果启用将使用config/keystore文件作为密钥文件.使用config/token.json文件中的sslKeyStorePassword字段为密钥密码,sslKeyManagerPassword为管理密码.###",
    "###name": "名称,多个节点中不能重名,默认为251.###",
    "###passivePorts": "ftp传输有主动和被动之分,如果使用了被动传输,设置被动端口范围,默认为29000-30000.###",
    "###prefix": "路径前缀.###",
    "###deepPath": "使用更深的路径###",
    "###extension": "扩展设置.###"
  },
  "dumpData": {
    "enable": false,
    "cron": "",
    "size": 7.0,
    "path": "",
    "###enable": "是否启用,默认禁用.###",
    "###cron": "定时任务cron表达式,默认每天凌晨2点进行备份.###",
    "###size": "最大保留份数,超过将自动删除最久的数据.###",
    "###path": "备份路径###",
    "###extension": "扩展设置.###"
  },
  "restoreData": {
    "enable": false,
    "cron": "",
    "path": "",
    "###enable": "是否启用.###",
    "###cron": "定时任务cron表达式###",
    "###path": "恢复路径###",
    "###extension": "扩展设置.###"
  },
  "nodeAgentEnable": true,
  "nodeAgentPort": 20010.0,
  "nodeAgentEncrypt": true,
  "autoStart": true,
  "selfHealthCheckEnable": false,
  "###enable": "是否启用###",
  "###order": "节点顺序,节点选举顺序0,1,2...###",
  "###center": "Center服务器配置###",
  "###application": "Application服务器配置###",
  "###web": "Web服务器配置###",
  "###data": "Data服务器配置###",
  "###storage": "Storage服务器配置###",
  "###dumpData": "定时数据导出配置###",
  "###restoreData": "定时数据导入配置###",
  "###stackTrace": "定时执行java stack trace###",
  "stackTrace": {
    "enable": false,
    "interval": 20.0,
    "###enable": "是否启用.###",
    "###interval": "运行jstack 间隔,默认20秒.###",
    "###extension": "扩展设置.###"
  },
  "###nodeAgentEnable": "是否启用节点代理###",
  "###nodeAgentPort": "是否启用节点端口###",
  "###nodeAgentEncrypt": "是否启用节点代理加密###",
  "###banner": "服务器控制台启动标识###",
  "###autoStart": "是否自动启动###",
  "###selfHealthCheckEnable": "是否启用节点上模块健康自检查,如果启用在提交到center之前将进行模块的健康检查.默认false###",
  "###extension": "扩展设置.###"
}
如上就是我配置,谢谢
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系客服 关注微信 下载APP 返回顶部 返回列表
viewthread