暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

【磐维数据库】使用jdbc驱动中的getPrimaryKeys方法时,传参不规范导致业务报错

Darcy 2024-05-25
721

项目场景:

业务系统适配磐维 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论