我刚刚更新了我的应用程序上的 informix jdbc 驱动程序(从 3.0 到 V4.10.JC4DE),在尝试与 informix 9 连接时出现以下错误。
java.sql.SQLException: Routine (get_data_type) can not be resolved.
at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3130)
at com.informix.jdbc.IfxSqli.D(IfxSqli.java:3412)
at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2325)
at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2250)
at com.informix.jdbc.IfxSqli.executeStatementQuery(IfxSqli.java:1485)
at com.informix.jdbc.IfxSqli.executeStatementQuery(IfxSqli.java:1465)
at com.informix.jdbc.IfxResultSet.a(IfxResultSet.java:211)
at com.informix.jdbc.IfxStatement.executeQueryImpl(IfxStatement.java:1064)
at com.informix.jdbc.IfxStatement.executeQuery(IfxStatement.java:236)
at com.informix.jdbc.IfxDatabaseMetaData.getColumns(IfxDatabaseMetaData.java:3549)
at com.mchange.v2.c3p0.impl.NewProxyDatabaseMetaData.getColumns(NewProxyDatabaseMetaData.java:3968)
at org.hibernate.tool.hbm2ddl.TableMetadata.initColumns(TableMetadata.java:197)
at org.hibernate.tool.hbm2ddl.TableMetadata.<init>(TableMetadata.java:58)
at org.hibernate.tool.hbm2ddl.DatabaseMetadata.getTableMetadata(DatabaseMetadata.java:113)
... 54 more
新驱动程序在 Informix 11 上运行良好。不幸的是,我必须支持与 Informix 9 的连接。
不幸的是,Informix 9 是一个非常非常老的引擎。我认为您应该升级(或告诉您的客户升级)到更新且受支持的版本。简单的升级应该会给他们带来许多新功能、更好的性能(至少提高 40%),当然还有更稳定的引擎。
实际上它确实不支持版本9。在产品发行说明页面上,您会看到:
“要使用 IBM Informix JDBC 驱动程序连接到 IBM Informix 数据库,您必须使用以下 IBM Informix 数据库服务器之一:
Version 11.50, 11.70, or 12.10
IBM Informix Extended Parallel Server, Version 8.3 or later
”
这里是 Java 开发新手。 我在尝试使过程调用返回一个对象进行测试时遇到了这个问题
相反,为输出创建一个投影接口并让函数返回该接口。
Jpa接口投影:https://www.baeldung.com/spring-data-jpa-projections#1-close-projections
不起作用:
public interface AnyInterface extends JpaRepository<Entity,Pk> {
@Procedure("procedure_name")
Object doProcedure(@Param("param1") String name);
}
工作过:
public interface AnyInterface extends JpaRepository<Entity,Pk> {
@Procedure("procedure_name")
ProjectionOutput doProcedure(@Param("param1") String name);
}
并在控制器中,将调用
repo.doProcedure(string)
的函数注释为
@Transactional(readOnly = true)
来自org.springframework.transaction.annotation
处理这个错误:
您尝试在没有周围事务的情况下执行 @Procedure 方法,该事务保持连接打开,以便实际上可以使用 ResultSet。确保消费者代码使用 @Transactional 或任何其他声明(只读)事务的方式。