项目场景:
业务系统适配磐维 V2.0,功能测试阶段。
问题描述
业务系统使用韦德框架,应用程序update数据的时候框架会去查询主键。查询不到程序就报错了。
业务系统使用磐维提供的jdbc驱动,调用PgDatabaseMetaData类中getPrimaryKeys方法,返回为空,导致业务系统功能报错。
报错日志如下:
ERROR( LogAdvice) 后台操作日志记录错误!
org.panweidb.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block, firstChar[P]
at org.panweidb.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2903)
at org.panweidb.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2632)
at org.panweidb.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:341)
at org.panweidb.jdbc.PgStatement.runQueryExecutor(PgStatement.java:570)
at org.panweidb.jdbc.PgStatement.executeInternal(PgStatement.java:547)
at org.panweidb.jdbc.PgStatement.execute(PgStatement.java:405)
at org.panweidb.jdbc.PgStatement.executeWithFlags(PgStatement.java:347)
at org.panweidb.jdbc.PgStatement.executeCachedSql(PgStatement.java:333)
at org.panweidb.jdbc.PgStatement.executeWithFlags(PgStatement.java:310)
at org.panweidb.jdbc.PgStatement.executeQuery(PgStatement.java:250)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at com.linkage.dbframework.jdbc.SimpleStatement.executeQuery(SimpleStatement.java:92)
at com.linkage.dbframework.jdbc.DaoManager.executeQuery(DaoManager.java:80)
at com.linkage.dbframework.jdbc.DaoManager.getSequence(DaoManager.java:648)
at com.linkage.dbframework.jdbc.DaoManager.getSequence(DaoManager.java:661)
at com.ailk.ech.imsm.core.common.util.MMMAppEntity.getSeq_16Digit(MMMAppEntity.java:28)
at com.ailk.ech.imsm.aop.LogAdvice.after(LogAdvice.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:620)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:602)
at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:47)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.ailk.ech.imsm.bean.common.treeList.MenuBean$$EnhancerBySpringCGLIB$$65226df8.auditSuccess(<generated>)
at com.ailk.ech.imsm.view.common.businessAudit.MenuAudit.auditSuccess(MenuAudit.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tapestry.listener.ListenerMap.invokeTargetMethod(ListenerMap.java:278)
at org.apache.tapestry.listener.ListenerMap.access$1(ListenerMap.java:269)
at org.apache.tapestry.listener.ListenerMap$SyntheticListener.invoke(ListenerMap.java:103)
at org.apache.tapestry.listener.ListenerMap$SyntheticListener.actionTriggered(ListenerMap.java:110)
at org.apache.tapestry.form.Submit.renderComponent(Submit.java:80)
at org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:859)
at org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:626)
at org.apache.tapestry.form.Form.renderComponent(Form.java:366)
at org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:859)
at org.apache.tapestry.form.Form.rewind(Form.java:601)
at org.apache.tapestry.engine.RequestCycle.rewindForm(RequestCycle.java:432)
at org.apache.tapestry.form.Form.trigger(Form.java:615)
at org.apache.tapestry.engine.DirectService.service(DirectService.java:169)
at org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:889)
at org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:200)
at org.apache.tapestry.ApplicationServlet.doPost(ApplicationServlet.java:329)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.ailk.ech.imsm.core.common.XssFilter.doFilter(XssFilter.java:37)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2549)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2538)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.panweidb.util.PSQLException: ERROR: syntax error at end of input
位置:42
at org.panweidb.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2903)
at org.panweidb.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2632)
at org.panweidb.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:341)
at org.panweidb.jdbc.PgStatement.runQueryExecutor(PgStatement.java:570)
at org.panweidb.jdbc.PgStatement.executeInternal(PgStatement.java:547)
at org.panweidb.jdbc.PgStatement.execute(PgStatement.java:405)
at org.panweidb.jdbc.PgStatement.executeWithFlags(PgStatement.java:347)
at org.panweidb.jdbc.PgStatement.executeCachedSql(PgStatement.java:333)
at org.panweidb.jdbc.PgStatement.executeWithFlags(PgStatement.java:310)
at org.panweidb.jdbc.PgStatement.executeQuery(PgStatement.java:250)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at com.linkage.dbframework.jdbc.SimpleStatement.executeQuery(SimpleStatement.java:92)
at com.linkage.dbframework.jdbc.DaoManager.executeQuery(DaoManager.java:80)
at com.linkage.dbframework.jdbc.DaoManager.queryList(DaoManager.java:1575)
at com.linkage.dbframework.jdbc.DaoManager.queryList(DaoManager.java:1614)
at com.linkage.dbframework.jdbc.DaoManager.queryByPK(DaoManager.java:1535)
at com.linkage.dbframework.jdbc.DaoManager.save(DaoManager.java:1408)
at com.linkage.dbframework.jdbc.DaoManager.save(DaoManager.java:1366)
at com.linkage.dbframework.jdbc.DaoManager.save(DaoManager.java:1327)
at com.linkage.dbframework.jdbc.DaoManager.save(DaoManager.java:1338)
at com.ailk.ech.imsm.bean.common.treeList.MenuBean.auditSuccess(MenuBean.java:330)
at com.ailk.ech.imsm.bean.common.treeList.MenuBean$$FastClassBySpringCGLIB$$20e4160a.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:44)
... 51 more
原因分析:
业务侧对自身需要获取的结果很清晰,也明确指明了调用的类以及方法,业务侧提出,很快定位到了问题为:业务系统调用该方法的参数输入错误,其中schema参数必须精确匹配数据库中模式名,不可使用模糊匹配。
业务系统实际输入值为%,实际传输到数据库的sql为:
SELECT
NULL AS TABLE_CAT,
n.nspname AS TABLE_SCHEM,
ct.relname AS TABLE_NAME,
a.attname AS COLUMN_NAME,
(i.keys).n AS KEY_SEQ,
ci.relname AS PK_NAME
FROM
pg_catalog.pg_class ct
JOIN pg_catalog.pg_attribute a ON
(ct.oid = a.attrelid)
JOIN pg_catalog.pg_namespace n ON
(ct.relnamespace = n.oid)
JOIN (
SELECT
i.indexrelid,
i.indrelid,
i.indisprimary,
information_schema._pg_expandarray(i.indkey) AS keys
FROM
pg_catalog.pg_index i
) i ON
(a.attnum = (i.keys).x
AND a.attrelid = i.indrelid)
JOIN pg_catalog.pg_class ci ON
(ci.oid = i.indexrelid)
WHERE
true
AND n.nspname = '%'
AND ct.relname = 'TF_MM_BUSINESS_AUDIT'
AND i.indisprimary
ORDER BY
table_name,
pk_name,
key_seq;
可以看到sql中where条件 n.nspname = ‘%’ 这里是=而不是like,所以不支持模糊匹配。
解决方案:
提供给业务系统正确参数调用方式,业务系统测试通过。
下图为该方法使用说明:

最后修改时间:2025-09-30 00:42:22
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




