我在进行查询以从特定表中检索数据(大约 2000 行)时遇到问题(它适用于其他实体,我有 50 多个表);我收到 500 错误。令人困惑的是,有时它可以工作(对于完全相同的数据),但一旦失败,它就不会再次工作,直到我重新启动服务器。这是我遇到的错误:
2023-08-23T17:13:53.563+02:00 ERROR 63647 --- [nio-8091-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalArgumentException: java.nio.charset.MalformedInputException: Input length = 1] with root cause
java.nio.charset.MalformedInputException: Input length = 1
at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274) ~[na:na]
at java.base/java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:820) ~[na:na]
at com.datastax.oss.driver.internal.core.type.codec.StringCodec.decode(StringCodec.java:110) ~[java-driver-core-4.17.0.jar:na]
at com.datastax.oss.driver.internal.core.type.codec.StringCodec.decode(StringCodec.java:35) ~[java-driver-core-4.17.0.jar:na]
at com.datastax.oss.driver.api.core.data.GettableByIndex.getObject(GettableByIndex.java:153) ~[java-driver-core-4.17.0.jar:na]
该异常似乎源自java.nio.charset.CoderResult.throwException。我正在使用 java-driver-core-4.17.0.jar 和 spring-data-cassandra-4.1.2.jar。
我尝试了不同的方法,但问题仍然间歇性地存在。一旦开始出现故障,让它再次工作的唯一方法就是重新启动服务器。 我已经寻找解决方案,但无法找到任何有助于诊断问题的相关信息。
我已基于此 Amazon Keyspaces 示例存储库
配置了 Cassandra我的 keyspaces-application.conf:
datastax-java-driver {
basic.contact-points = [ "<basic.contact-points>" ]
advanced.reconnect-on-init = true
# Amazon Keyspaces supports LOCAL_QUORUM for Inserts, Updates, and Deletes
# Amazon Keyspaces supports ONE, LOCAL_ONE, and LOCAL_QUORUM for Selects
basic.request.consistency = "LOCAL_QUORUM"
basic.request.serial-consistency = "LOCAL_SERIAL"
# set to true for retry policy to apply on writes
basic.request.default-idempotence = true
advanced.retry-policy {
class = com.methodz.seo_jungle.config.AmazonKeyspacesRetryPolicy
max-attempts = 6
}
basic.load-balancing-policy {
local-datacenter = "<local-datacenter>"
slow-replica-avoidance = false
}
#Use IAM ROLES and service roles
# https://github.com/aws/aws-sigv4-auth-cassandra-java-driver-plugin
# advanced.auth-provider = {
# class = software.aws.mcs.auth.SigV4AuthProvider
# aws-region = us-east-1
# }
#
#Use service specific credentials
# https://docs.aws.amazon.com/keyspaces/latest/devguide/programmatic.credentials.ssc.html
advanced.auth-provider{
class = PlainTextAuthProvider
username = "<username>"
password = "<password>"
}
advanced.ssl-engine-factory {
class = DefaultSslEngineFactory
truststore-path = "<truststore-path>"
truststore-password = "<truststore-password>"
#hostname validation must be set to false
hostname-validation = false
}
# For every connection, Amazon Keyspaces allows 3000 request per connection per endpoint
# If pool.local.size = 3 * 3 endpoints = 9 total connections for session
# For 9 connections at 3000 request per connection for a total of 27,000 rps
advanced.connection.pool.local.size = 3
}
这是我在项目中使用的依赖项:
org.springframework.boot:spring-boot-starter:3.0.4
javax.servlet:javax.servlet-api:4.0.1
org.springframework.boot:spring-boot-starter-actuator:3.0.4
org.springframework.boot:spring-boot-starter-test:3.0.4
org.springframework.boot:spring-boot-starter-web:3.0.4
org.springframework.boot:spring-boot-starter-security:3.0.4
io.jsonwebtoken:jjwt-api:0.11.5
io.jsonwebtoken:jjwt-jackson:0.11.5
io.jsonwebtoken:jjwt-impl:0.11.5
com.fasterxml.jackson.module:jackson-module-kotlin:2.15.2
org.springdoc:springdoc-openapi-starter-webmvc-api:2.1.0
org.springframework.boot:spring-boot-starter-aop:3.0.4
org.springframework.data:spring-data-elasticsearch:5.0.0
javax.xml.bind:jaxb-api:2.4.0-b180830.0359
org.springframework.data:spring-data-cassandra:4.1.2
com.datastax.oss:java-driver-core:4.17.0
org.springframework.boot:spring-boot-starter-data-cassandra:3.0.4
software.aws.mcs:aws-sigv4-auth-cassandra-java-driver-plugin:4.0.6
org.jetbrains.kotlin:kotlin-reflect:1.8.20-RC
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20-RC
org.springframework.boot:spring-boot-devtools:3.0.4
org.springframework.boot:spring-boot-starter-logging:3.0.4
org.springframework:spring-context-support:6.0.6
org.springframework.boot:spring-boot-starter-mail:3.0.4
org.jetbrains.kotlinx:kotlinx-coroutines-core:pom:1.7.1
com.google.code.gson:gson:2.10.1
com.google.cloud:libraries-bom:pom:26.11.0
org.junit.jupiter:junit-jupiter-engine:5.9.2
javax.persistence:javax.persistence-api:2.2
org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.7.1
org.springframework.boot:spring-boot-starter-validation:3.1.2
org.hibernate.validator:hibernate-validator:8.0.1.Final
org.jsoup:jsoup:1.15.3
us.codecraft:xsoup:0.3.7
com.squareup.okhttp3:okhttp:4.9.1
导致此问题的模型可以在下面的代码片段中看到:
package com.methodz.seo_jungle.dao.organization
import org.springframework.data.annotation.Id
import org.springframework.data.cassandra.core.cql.PrimaryKeyType
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn
import org.springframework.data.cassandra.core.mapping.Table
import java.util.*
@Table("organization")
data class Organization(
@Id
@PrimaryKeyColumn("id", type = PrimaryKeyType.PARTITIONED)
var id: UUID = UUID.randomUUID(),
var name: String,
var type: String = OrganizationType.COMPANY.name, //OrganizationType = OrganizationType.COMPANY
var siret: String = "",
var tva: String = "",
var email: String = "",
var address: String = "",
var additionalAddressDetails: String = "",
var city: String = "",
var zipCode: String = "",
var country: String = "",
var legalRepresentativeFirstname: String = "",
var legalRepresentativeLastname: String = "",
var legalRepresentativeCountry: String = "",
var legalRepresentativeBirthdate: Long = 0,
var legalRepresentativeNationality: String = "",
var currentCreditAmount: Double = 0.0,
var totalCreditSpend: Double = 0.0,
var totalCreditEarned: Double = 0.0,
var status: String = OrganizationStatus.DRAFT.name
var created: Long = DateUtils.getTimestamp(),
var updated: Long = 0,
var deleted: Long = 0
)
使用的存储库是一个没有覆盖的简单存储库
@Repository
interface SupportRepository : CassandraRepository<Support, UUID> {}
我尝试使用 Amazon Corretto JDK 11 来匹配示例存储库,但仍然面临相同的问题(我正在使用 openJDK 20)
我不知道下一步该尝试什么
该错误似乎与 DataStax Java 驱动程序中的字符串编解码器有关。它的发生不一致,重新启动服务器可以暂时修复它。我已经寻找解决方案,但无法找到任何有助于诊断问题的相关信息。
任何帮助或见解将不胜感激!
经过一番调查,我发现问题出在 Spring Data Cassandra 使用的准备好的查询上。不知何故,禁用它们解决了问题,但我不知道如何正确解决它。
@Bean
open fun cassandraTemplate(sessionFactory: SessionFactory?, converter: CassandraConverter?): CassandraOperations {
val template = CassandraTemplate(sessionFactory!!, converter!!)
template.isUsePreparedStatements=false
return template
}