标签: spring-jdbc

无法确定正确的呼叫签名 - 使用simpleJdbcCall时出现多个过程/函数/签名错误

这是我的DAO代码

 this.calcRTRDetails = new SimpleJdbcCall(dataSource).withCatalogName("score_rtr").
                     withProcedureName("calc_rtr_dtls").declareParameters(
                        new SqlParameter("p_repy_track", Types.ARRAY)    
                      ).returningResultSet("p_track_dtls",new RowMapper<String>() {

                        @Override
                        public String mapRow(ResultSet rs, int arg1)
                                throws SQLException {
                            // TODO Auto-generated method stub
                            return rs.getString(1);
                        }
                    } );
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

org.springframework.dao.InvalidDataAccessApiUsageException: Unable to determine the correct call signature - multiple procedures/functions/signatures for CALC_RTR_DTLS found [SCORE_RTR.SCORE.CALC_RTR_DTLS, SCORE_RTR.SCORE.CALC_RTR_DTLS]
Run Code Online (Sandbox Code Playgroud)

可能是什么原因?

oracle spring-mvc spring-jdbc

4
推荐指数
1
解决办法
5633
查看次数

Mysql-Connector-Java 与 Spring-Jdbc 之间的区别

据我所知,我们使用 Mysql-connector jar 将 java 应用程序连接到数据库。我正在关注 spring 教程,上面提到的东西都是通过 Maven 添加的。两者有什么区别?

spring jdbc mysql-connector spring-jdbc

4
推荐指数
1
解决办法
2467
查看次数

使用 lambda 和 JdbcTemplate 查询方法显示不明确的错误

当我编译此代码时,它显示 [ERROR] 方法 query(String, Object[], ResultSetExtractor) 对于 JdbcTemplate 类型不明确

Collection<MyType> col = getJdbcTemplate().query(someQuery, new Object[]{param},
    rs -> {
        Map<Long, MyType> map = new HashMap();
        while (rs.next()) {
        // mapping logic
        }
        return map.values();
    });
Run Code Online (Sandbox Code Playgroud)

但是,如果我rs(ResultSetExtractor<Collection<MyType>>)某种方式对其进行转换,则会正确编译。

Collection<MyType> col = getJdbcTemplate().query(someQuery, new Object[]{param},
    (ResultSetExtractor<Collection<MyType>>)  rs -> {
        Map<Long, MyType> map = new HashMap();
        while (rs.next()) {
        // mapping logic
        }
        return map.values();
    });
Run Code Online (Sandbox Code Playgroud)

但是我的 IDE(带有声纳)将其报告为多余的演员,将 lambda 体内的所有内容报告为未使用。我正在使用 jdk 1.8.0_121

有人可以对此有所了解吗,谢谢

java lambda spring-jdbc sonarqube

4
推荐指数
1
解决办法
7610
查看次数

Spring Session table-name 属性不改变表名

我必须能够重命名默认的 Spring Session 表,并在spring 会话文档中找到以下配置选项。

spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # 用于初始化数据库模式的 SQL 文件的路径。spring.session.jdbc.table-name=SPRING_SESSION #用于存储会话的数据库表的名称。

这是我试图在 application.properties 中设置的内容:

spring.session.store-type=jdbc
spring.session.jdbc.table-name: APP_SPR_SESSION
spring.session.jdbc.schema: src/main/resources/appSpringSession.sql
Run Code Online (Sandbox Code Playgroud)

以下是 appSpringSession.sql 的内容,它是schema-oracle.sql的修改/重命名版本

CREATE TABLE app_app.APP_SPR_SESSION (
   PRIMARY_ID CHAR(36) NOT NULL,
   SESSION_ID CHAR(36) NOT NULL,
   CREATION_TIME NUMBER(19,0) NOT NULL,
   LAST_ACCESS_TIME NUMBER(19,0) NOT NULL,
   MAX_INACTIVE_INTERVAL NUMBER(10,0) NOT NULL,
   EXPIRY_TIME NUMBER(19,0) NOT NULL,
   PRINCIPAL_NAME VARCHAR2(100 CHAR),
   CONSTRAINT APP_SPR_SESSION_PK PRIMARY KEY (PRIMARY_ID)
);

CREATE UNIQUE INDEX APP_SPR_SESSION_IX1 ON APP_SPR_SESSION (SESSION_ID);
CREATE INDEX APP_SPR_SESSION_IX2 ON APP_SPR_SESSION (EXPIRY_TIME);
CREATE INDEX APP_SPR_SESSION_IX3 ON APP_SPR_SESSION …
Run Code Online (Sandbox Code Playgroud)

oracle spring spring-jdbc spring-boot spring-session

4
推荐指数
1
解决办法
3232
查看次数

Spring ScriptUtils - PostgreSQL 中未终止的美元报价

我使用以下 Java 代码来运行 SQL 脚本:

@SpringBootApplication
public class Application implements CommandLineRunner {
  @Autowired
  DataSource ds;

  @Value("classpath:test.sql")
  Resource resource;

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(String... args) throws Exception {
    try {
      @Cleanup
      Connection c = ds.getConnection();
      ScriptUtils.executeSqlScript(c, resource);

    } catch (Exception e) {
      e.printStackTrace();
    }

  }

}
Run Code Online (Sandbox Code Playgroud)

我使用的 Spring boot 版本是 2.1.7.RELEASE,PostgreSQL 通过以下方式在本地 docker 镜像中运行:

docker run --rm   --name pg-docker -e POSTGRES_PASSWORD=PASSWORD -d -p 5432:5432 -v postgresql:/var/lib/postgresql/data  postgres:11.3
Run Code Online (Sandbox Code Playgroud)

我使用的 SQL 脚本是:

CREATE OR REPLACE …
Run Code Online (Sandbox Code Playgroud)

java postgresql spring spring-jdbc

4
推荐指数
2
解决办法
4102
查看次数

测试中的 NoClassDefFoundError org/springframework/jdbc/core/ConnectionCallback

我陷入困境,即使我从 Gradle 依赖项中排除了与 JDBC 相关的任何内容,我也会收到此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/jdbc/core/ConnectionCallback
    at java.lang.Class.getDeclaredMethods0(Native Method)
    ... (skipped)
Caused by: java.lang.ClassNotFoundException: org.springframework.jdbc.core.ConnectionCallback
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    ... (skipped)
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪仅包含 Gradle、Java 和 JUnit 的内部类。我不明白哪个类在运行时需要 JDBC 驱动程序。

我运行gradle integrationTestintegrationTest的自定义 Gradle 任务。我尝试为这个问题创建一个最小的、可重现的示例。我创建了一个类似但较小的 gradle 项目,我在其中使用了此任务和一些关键依赖项,并且运行良好(我无法重现此错误,因此我无法与您共享小代码,抱歉)。我认为这意味着我的自定义任务integrationTest工作正常,问题出在主项目的传递依赖项中。

我尝试gradle dependencies | grep jdbc并排除了 1 个名称中提到 jdbc 的库。此后,问题仍然存在。

我尝试向主项目的测试范围添加新的依赖项:

integrationTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc'
Run Code Online (Sandbox Code Playgroud)

此后,问题就消失了。但我不喜欢这个解决方案,因为它看起来像是一个解决方法,我想找到这个问题的根本原因。主项目的测试模块不需要连接到关系数据库(仅Mongo)来完成其工作,因此它在运行时不需要JDBC驱动程序。正确的?

请帮我调试一下。

java dependencies noclassdeffounderror spring-jdbc gradle

4
推荐指数
1
解决办法
8633
查看次数

用于测试 Spring Boot 应用程序的初始化 H2 数据库期间出现异常“org.h2.jdbc.JdbcSQLSyntaxErrorException:未找到表“NAME””

我编写用@SpringBootTest注释的集成测试。为了运行测试,我将测试资源中的 data.sql 中的数据插入到 H2 数据库中。

\n

我遇到的情况是,第一次测试成功运行,经过多次后,出现错误,告诉我,H2 无法在表中插入数据,因为找不到该表。每次启动测试时都会出现不同的原始错误。在同一日志中,我看到在异常发生之前该表已创建,并且其他插入已成功执行。我看到我的 5 个测试中有 4 个是绿色的,一个是红色的。不同的时间可能有不同的测试。

\n

重新启动 IDE 可使测试再次成功运行 3-4 次。之后,错误返回。

\n

我尝试将 @DirtiesContext() 与我的测试类和测试方法一起使用,但它没有解决问题。

\n

我猜测问题的根源可能在于我初始化数据库的方式。对于这两种数据库,我都使用一个 data.sql 文件的引用。我没有找到一种方法将它们分成不同的 *.sql 文件。

\n

第二个猜测是在创建表之前就开始插入数据库。我现在通过将所有插入移动到测试代码中来检查这个理论。但我不确定这是否会有所帮助,因为我播种日志是在插入开始之前创建的表。

\n

我在每次测试运行之前使用“mvn clean”。

\n

我将非常感谢您在解决这个问题方面的建议。

\n

我的实体:

\n
@Entity\n@Table(name = "entity1", schema = "schema1")\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\npublic class SomeEntityClass extends GenericEntity<Long> { ...}\n\n\n@MappedSuperclass\npublic abstract class GenericEntity<ID extends Serializable> implements Serializable {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    @Column\n\n    protected ID id;\n\n//getter, setter\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

在我的 data.sql 文件中初始化看起来像这样:

\n
create schema if not exists schema1;\ncreate schema if …
Run Code Online (Sandbox Code Playgroud)

h2 spring-jdbc spring-data-jpa spring-boot spring-boot-test

4
推荐指数
1
解决办法
6991
查看次数

手动增加 Hikari Pool 中使用的连接数

我希望在微服务启动之前有一些特定数量的连接可供使用。我正在使用 Hikari Pool 和 Spring Boot。

我使用特定数字的循环并调用“SELECT 1 FROM DUAL”来手动创建连接,但它似乎不是创建多个连接,而是一次又一次地重复使用相同的连接。

这个怎么做 ?

oracle spring-jdbc spring-boot hikaricp

4
推荐指数
1
解决办法
3万
查看次数

JDBC对Oracle的调用返回3个问号

我使用JDBCTemplate调用oracle存储过程,它具有STRUCT的输入/输出参数.此结构上的一个字段是VARCHAR,它根据存储过程逻辑进行更新.但是当从调用返回时它只包含三个问号 - '???'.这可能是Riddler的工作,但听起来更像是char编码问题.

这工作正常,直到我们将数据库切换到具有WE8ISO8859P15(ISO8859)字符编码的数据库,这是通过执行以下操作检索的:

SELECT NLS_CHARACTERSET FROM NLS_DATABASE_PARAMETERS
Run Code Online (Sandbox Code Playgroud)

以前工作的字符集是WE8MSWIN1252(MSWIN-1252),它工作正常.所以我猜这是一个字符集问题,虽然我有点小心,因为它总是只返回3个问号,无论应该返回多少文本.

据我所知,底层的JDBC驱动程序(jdbc:oracle:thin)会自动执行所有字符编码,并将数据库字符集转换为UTF-16(Java字符编码)但是看起来没有发生这种情况.我正在使用StoredProcedure类(Spring的一部分)来调用StoredProcedure.

我也尝试将orai18n.jar添加到类路径中,但没有成功.然而,考虑到ISO-8859是一个非常标准的字符集似乎很不寻常,所以我可能会走错路.

任何帮助将不胜感激.

java oracle jdbc spring-jdbc

3
推荐指数
1
解决办法
3463
查看次数

Spring JDBC给出错误:来自JdbcTemplate类型的"queryForObject(String,Object [],Class <String>)引用了缺少的类型DataAccessException"

我在DAO中创建了一个方法:

public String getUserName(int userid){
    String sql="SELECT userName from UserDetail where userid=?";
    return jdbcTemplate.queryForObject(sql, new Object[]{userid}, String.class);
}
Run Code Online (Sandbox Code Playgroud)

这一行:jdbcTemplate.queryForObject(sql, new Object[]{userid}, String.class)给出以下错误:

The method queryForObject(String, Object[], Class<String>) from the type JdbcTemplate refers to the missing type DataAccessException

Multiple markers at this line
- The type org.springframework.dao.DataAccessException cannot be resolved. It is indirectly referenced from required .class files
- The method queryForObject(String, Object[], Class<String>) from the type JdbcTemplate refers to the missing type 
 DataAccessException
Run Code Online (Sandbox Code Playgroud)

我使用spring-jdbc 4.0.0与mysql-connector 5.1.25,commons-dbcp-1.4和commons-pool-1.6.你能告诉我我在做什么吗?

java mysql database spring-jdbc

3
推荐指数
1
解决办法
8384
查看次数