猿问

CannotCreateTransactionException: com.microsoft.

我正在使用带有 Microsoft SQL 2014 数据库的 Spring Batch。它在带有 OpenJDK 11.0.2 的 Tomcat 9.0.16 服务器上运行


我的问题是我随机出现错误,其中没有可能的 JDBC 连接。Job中定义了两个Steps:第一个包含如下Tasklet


相关代码:


@Bean

    public Step stepOne() {

        final Tasklet taskletOne = new Tasklet() {

            @Override

            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {                

                JdbcTemplate cmd = new JdbcTemplate(dataSource);

                maxlsnr = cmd.queryForObject("select max(ID) from dbo.MY TABLE", Integer.class);

                LOG.info("MAX ID: " + maxlsnr);

                return RepeatStatus.FINISHED;

            }

        };

        TaskletStepBuilder stepBuilder = stepBuilderFactory.get("QUERY FOR INTEGER")

                .tasklet(taskletOne);

        stepBuilder.listener(taskletOne);

        return stepBuilder.build();

    }

第二步包含一个基于块的 FlatfileItemReader(读取 CSV)、处理器(基于 Step1 中的 # 过滤项目)和一个 Itemwriter(插入 DB)。


我们随机得到以下错误:


 2019-03-04 09:14:01.607 ERROR 497 --- [io-8080-exec-92] o.s.b.w.servlet.support.ErrorPageFilter  : Forwarding to error page from request [/batch/jobs/myjob] due to exception [Could not open JDBC Connection for transaction; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Fehler bei der Anmeldung für den Benutzer 'xxxx'. ClientConnectionId:ecb4e02c-e40e-4f43-957d-a870e46703fd]

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Fehler bei der Anmeldung für den Benutzer 'xxxx'. ClientConnectionId:ecb4e02c-e40e-4f43-957d-a870e46703fd


数据库显示没有错误,似乎工作没有任何问题。我正在使用最新的 MSSQL JDBC 驱动程序:7.2.1 所有其他程序都可以在相同的用户 + 数据库中正常工作。


我已经使用新创建的凭据进行了尝试,但问题仍然存在。


慕森卡
浏览 165回答 1
1回答

catspeake

一个月后没有找到解决方案,我终于设法让它按要求工作。问题出在默认的 Spring 数据库/连接池管理配置中。我将底层 JDBC 连接池切换到HikariCP,问题就消失了!我在我的 Maven pom.xml 中添加了 HikariCP 依赖项,并将我的默认 DataSource 更改为 HikariDataSource。final HikariConfig config = new HikariConfig();    config.setPoolName(environment.getProperty("datasourcewww.serverName"));    config.setDataSourceClassName("com.microsoft.sqlserver.jdbc.SQLServerDataSource");    config.setUsername(userName);    config.setPassword(password);    config.addDataSourceProperty("serverName", serverName);    config.addDataSourceProperty("databaseName", databaseName);    config.setConnectionTimeout(10000);    config.setMinimumIdle(10);    config.setMaximumPoolSize(200);    config.setIdleTimeout(1800000);    LOG.info("HikariCP DataSource initialized.");    return new HikariDataSource(config);我希望这会有所帮助,以防有人遇到同样的麻烦......
随时随地看视频慕课网APP

相关分类

Java
我要回答