JHipster 多数据源导致 JdbcSQLSyntaxErrorException: Sequence "SEQUENCEGENERATOR" not found
JHipster multiple datasource causes JdbcSQLSyntaxErrorException: Sequence "SEQUENCEGENERATOR" not found
在 之后,我想为我的应用程序添加两个额外的数据源(都是 SQL 服务器)。我的设置是:
- 让JHipster有自己的数据库,用JPA访问。开发环境使用H2,生产环境使用SQL Server.
- 添加两个 SQL 服务器数据源,我将仅与 JDBC (
JdbcTemplate
) 一起使用。这些是 read-only
个数据库,我只需要 运行 查询它们。
因此,我生成了一个新的 JHipster Monolithic 应用程序 (6.0.1),其中包含用于开发的基于磁盘的 h2 和用于生产的 SQL 服务器。我将 DatabaseConfigration
更改为:
@Configuration
@EnableJpaRepositories(".....repository")
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
@EnableTransactionManagement
public class DatabaseConfiguration {
private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class);
private final Environment env;
public DatabaseConfiguration(Environment env) {
this.env = env;
}
/**
* Open the TCP port for the H2 database, so it is available remotely.
*
* @return the H2 database TCP server.
* @throws SQLException if the server failed to start.
*/
@Bean(initMethod = "start", destroyMethod = "stop")
@Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)
public Object h2TCPServer() throws SQLException {
String port = getValidPortForH2();
log.debug("H2 database is available on port {}", port);
return H2ConfigurationHelper.createServer(port);
}
private String getValidPortForH2() {
int port = Integer.parseInt(env.getProperty("server.port"));
if (port < 10000) {
port = 10000 + port;
} else {
if (port < 63536) {
port = port + 2000;
} else {
port = port - 2000;
}
}
return String.valueOf(port);
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties defaultDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.hikari")
public DataSource defaultDataSource() {
return defaultDataSourceProperties().initializeDataSourceBuilder()
//.type(HikariDataSource.class)
.build();
}
@Bean(name = "entityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(defaultDataSource())
.packages(MyMainApplicationClassApp.class)
.persistenceUnit("default")
.build();
}
@Bean(name = "transactionManager")
@Primary
public JpaTransactionManager db2TransactionManager(@Qualifier("entityManagerFactory") final EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
}
我创建了一个名为 AdditionalDatabaseConfiguration
的新配置 class,首先我只想添加一个额外的数据库:
@Configuration
@EnableTransactionManagement
public class AdditionalDatabaseConfiguration {
@Bean
@ConfigurationProperties("sync.datasource")
public DataSourceProperties SyncDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("sync.datasource.hikari")
public HikariDataSource SyncDataSource() {
var properties = SyncDataSourceProperties();
return properties.initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
}
}
我还没有更改默认的 spring.datasource
配置,但我确实为新的 ds 添加了配置:
sync:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:sqlserver://***:1433;database=***
username: ****
password: ***
testOnBorrow: true
validationQuery: SELECT 1
hikari:
poolName: HikariSync
auto-commit: false
connection-test-query: SELECT 1
maximum-pool-size: 2
idle-timeout: 10000
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
应用程序编译并启动,没有错误或警告,应用程序的主页也加载了。但是,如果我尝试登录,则会出现异常:
https://pastebin.com/raw/HWSEQGyq
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [call next value for sequenceGenerator]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:279)
at org.sprin.....
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
... 130 common frames omitted
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Sequence "SEQUENCEGENERATOR" not found; SQL statement:
call next value for sequenceGenerator [90036-199]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:573)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
at org.h2.message.DbException.get(DbException.java:205)
at org.h2.message.DbException.get(DbException.java:181)
at org.h2.command.Parser.readSequence(Parser.java:7196)
at org.h2.command.Parser.readTermWithIdentifier(Parser.java:4192)
at org.h2.command.Parser.readTerm(Parser.java:3972)
at org.h2.command.Parser.readFactor(Parser.java:3090)
at org.h2.command.Parser.readSum(Parser.java:3077)
at org.h2.command.Parser.readConcat(Parser.java:3047)
at org.h2.command.Parser.readCondition(Parser.java:2900)
at org.h2.command.Parser.readAnd(Parser.java:2872)
at org.h2.command.Parser.readExpression(Parser.java:2864)
at org.h2.command.Parser.parseCall(Parser.java:6043)
at org.h2.command.Parser.parsePrepared(Parser.java:848)
at org.h2.command.Parser.parse(Parser.java:788)
at org.h2.command.Parser.parse(Parser.java:760)
at org.h2.command.Parser.prepareCommand(Parser.java:683)
at org.h2.engine.Session.prepareLocal(Session.java:627)
at org.h2.engine.Session.prepareCommand(Session.java:565)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1292)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:77)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:349)
at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:311)
at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.doPrepare(StatementPreparerImpl.java:87)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
... 165 common frames omitted
可能我的 @Primary
数据源 configuration/code 不正确。谁能告诉我要添加什么?
编辑:如果我删除我的数据源配置,我可以登录,所以这是错误的原因。
编辑:主要问题是Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Sequence "SEQUENCEGENERATOR" not found; SQL statement:
call next value for sequenceGenerator [90036-199]
Edit2.: 为默认数据源设置方言没有解决问题(使用 yml):
jpa:
database-platform: io.github.jhipster.domain.util.FixedH2Dialect <-- maybe this is the issue?
database: H2
show-sql: true
properties:
hibernate.id.new_generator_mappings: true
hibernate.connection.provider_disables_autocommit: true
hibernate.cache.use_second_level_cache: true
hibernate.cache.use_query_cache: false
hibernate.generate_statistics: false
hibernate.dialect: org.hibernate.dialect.H2Dialect <-- this
Edit3:我在开发配置文件(直接 SQL 服务器)上生成了一个没有使用 H2 的新项目,添加了相同的多数据源配置,但问题仍然存在。我刚得到一个 com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'sequenceGenerator'.
异常。
Edit4.: 我的 MSSQL 问题可以通过在 domain.User
和 domain.PersistentAuditEvent
文件中将生成器名称更改为 sequence_generator
来解决。 H2具体问题?
tasukete kudasai
在我的例子中,jhipster 为序列生成了不同的名称(我选择了 oracle db 用于生产)
"hibernate_sequence" 在 00000000000000_initial_schema.xml
和"sequenceGenerator" 域实体
@Id
@GeneratedValue(策略=GenerationType.SEQUENCE,生成器="sequenceGenerator")
@SequenceGenerator(名字="sequenceGenerator")
私人长号;
两处设置同名问题已解决
在
- 让JHipster有自己的数据库,用JPA访问。开发环境使用H2,生产环境使用SQL Server.
- 添加两个 SQL 服务器数据源,我将仅与 JDBC (
JdbcTemplate
) 一起使用。这些是read-only
个数据库,我只需要 运行 查询它们。
因此,我生成了一个新的 JHipster Monolithic 应用程序 (6.0.1),其中包含用于开发的基于磁盘的 h2 和用于生产的 SQL 服务器。我将 DatabaseConfigration
更改为:
@Configuration
@EnableJpaRepositories(".....repository")
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
@EnableTransactionManagement
public class DatabaseConfiguration {
private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class);
private final Environment env;
public DatabaseConfiguration(Environment env) {
this.env = env;
}
/**
* Open the TCP port for the H2 database, so it is available remotely.
*
* @return the H2 database TCP server.
* @throws SQLException if the server failed to start.
*/
@Bean(initMethod = "start", destroyMethod = "stop")
@Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)
public Object h2TCPServer() throws SQLException {
String port = getValidPortForH2();
log.debug("H2 database is available on port {}", port);
return H2ConfigurationHelper.createServer(port);
}
private String getValidPortForH2() {
int port = Integer.parseInt(env.getProperty("server.port"));
if (port < 10000) {
port = 10000 + port;
} else {
if (port < 63536) {
port = port + 2000;
} else {
port = port - 2000;
}
}
return String.valueOf(port);
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties defaultDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.hikari")
public DataSource defaultDataSource() {
return defaultDataSourceProperties().initializeDataSourceBuilder()
//.type(HikariDataSource.class)
.build();
}
@Bean(name = "entityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(defaultDataSource())
.packages(MyMainApplicationClassApp.class)
.persistenceUnit("default")
.build();
}
@Bean(name = "transactionManager")
@Primary
public JpaTransactionManager db2TransactionManager(@Qualifier("entityManagerFactory") final EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
}
我创建了一个名为 AdditionalDatabaseConfiguration
的新配置 class,首先我只想添加一个额外的数据库:
@Configuration
@EnableTransactionManagement
public class AdditionalDatabaseConfiguration {
@Bean
@ConfigurationProperties("sync.datasource")
public DataSourceProperties SyncDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("sync.datasource.hikari")
public HikariDataSource SyncDataSource() {
var properties = SyncDataSourceProperties();
return properties.initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
}
}
我还没有更改默认的 spring.datasource
配置,但我确实为新的 ds 添加了配置:
sync:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:sqlserver://***:1433;database=***
username: ****
password: ***
testOnBorrow: true
validationQuery: SELECT 1
hikari:
poolName: HikariSync
auto-commit: false
connection-test-query: SELECT 1
maximum-pool-size: 2
idle-timeout: 10000
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
应用程序编译并启动,没有错误或警告,应用程序的主页也加载了。但是,如果我尝试登录,则会出现异常:
https://pastebin.com/raw/HWSEQGyq
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [call next value for sequenceGenerator]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:279)
at org.sprin.....
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
... 130 common frames omitted
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Sequence "SEQUENCEGENERATOR" not found; SQL statement:
call next value for sequenceGenerator [90036-199]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:573)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
at org.h2.message.DbException.get(DbException.java:205)
at org.h2.message.DbException.get(DbException.java:181)
at org.h2.command.Parser.readSequence(Parser.java:7196)
at org.h2.command.Parser.readTermWithIdentifier(Parser.java:4192)
at org.h2.command.Parser.readTerm(Parser.java:3972)
at org.h2.command.Parser.readFactor(Parser.java:3090)
at org.h2.command.Parser.readSum(Parser.java:3077)
at org.h2.command.Parser.readConcat(Parser.java:3047)
at org.h2.command.Parser.readCondition(Parser.java:2900)
at org.h2.command.Parser.readAnd(Parser.java:2872)
at org.h2.command.Parser.readExpression(Parser.java:2864)
at org.h2.command.Parser.parseCall(Parser.java:6043)
at org.h2.command.Parser.parsePrepared(Parser.java:848)
at org.h2.command.Parser.parse(Parser.java:788)
at org.h2.command.Parser.parse(Parser.java:760)
at org.h2.command.Parser.prepareCommand(Parser.java:683)
at org.h2.engine.Session.prepareLocal(Session.java:627)
at org.h2.engine.Session.prepareCommand(Session.java:565)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1292)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:77)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:349)
at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:311)
at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.doPrepare(StatementPreparerImpl.java:87)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
... 165 common frames omitted
可能我的 @Primary
数据源 configuration/code 不正确。谁能告诉我要添加什么?
编辑:如果我删除我的数据源配置,我可以登录,所以这是错误的原因。
编辑:主要问题是Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Sequence "SEQUENCEGENERATOR" not found; SQL statement:
call next value for sequenceGenerator [90036-199]
Edit2.: 为默认数据源设置方言没有解决问题(使用 yml):
jpa:
database-platform: io.github.jhipster.domain.util.FixedH2Dialect <-- maybe this is the issue?
database: H2
show-sql: true
properties:
hibernate.id.new_generator_mappings: true
hibernate.connection.provider_disables_autocommit: true
hibernate.cache.use_second_level_cache: true
hibernate.cache.use_query_cache: false
hibernate.generate_statistics: false
hibernate.dialect: org.hibernate.dialect.H2Dialect <-- this
Edit3:我在开发配置文件(直接 SQL 服务器)上生成了一个没有使用 H2 的新项目,添加了相同的多数据源配置,但问题仍然存在。我刚得到一个 com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'sequenceGenerator'.
异常。
Edit4.: 我的 MSSQL 问题可以通过在 domain.User
和 domain.PersistentAuditEvent
文件中将生成器名称更改为 sequence_generator
来解决。 H2具体问题?
tasukete kudasai
在我的例子中,jhipster 为序列生成了不同的名称(我选择了 oracle db 用于生产) "hibernate_sequence" 在 00000000000000_initial_schema.xml
和"sequenceGenerator" 域实体
@Id @GeneratedValue(策略=GenerationType.SEQUENCE,生成器="sequenceGenerator") @SequenceGenerator(名字="sequenceGenerator") 私人长号;
两处设置同名问题已解决