这是我的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)
可能是什么原因?
据我所知,我们使用 Mysql-connector jar 将 java 应用程序连接到数据库。我正在关注 spring 教程,上面提到的东西都是通过 Maven 添加的。两者有什么区别?
当我编译此代码时,它显示 [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
有人可以对此有所了解吗,谢谢
我必须能够重命名默认的 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) 我使用以下 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) 我陷入困境,即使我从 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 integrationTest我integrationTest的自定义 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驱动程序。正确的?
请帮我调试一下。
我编写用@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\nRun Code Online (Sandbox Code Playgroud)\n在我的 data.sql 文件中初始化看起来像这样:
\ncreate schema if not exists schema1;\ncreate schema if …Run Code Online (Sandbox Code Playgroud) 我希望在微服务启动之前有一些特定数量的连接可供使用。我正在使用 Hikari Pool 和 Spring Boot。
我使用特定数字的循环并调用“SELECT 1 FROM DUAL”来手动创建连接,但它似乎不是创建多个连接,而是一次又一次地重复使用相同的连接。
这个怎么做 ?
我使用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是一个非常标准的字符集似乎很不寻常,所以我可能会走错路.
任何帮助将不胜感激.
我在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.你能告诉我我在做什么吗?
spring-jdbc ×10
java ×5
oracle ×4
spring ×3
spring-boot ×3
jdbc ×2
database ×1
dependencies ×1
gradle ×1
h2 ×1
hikaricp ×1
lambda ×1
mysql ×1
postgresql ×1
sonarqube ×1
spring-mvc ×1