为了账号安全,请及时绑定邮箱和手机立即绑定

CannotCreateTransactionException: com.microsoft.

CannotCreateTransactionException: com.microsoft.

慕森卡 2022-07-14 17:20:38
我正在使用带有 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 所有其他程序都可以在相同的用户 + 数据库中正常工作。我已经使用新创建的凭据进行了尝试,但问题仍然存在。
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

一个月后没有找到解决方案,我终于设法让它按要求工作。


问题出在默认的 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);

我希望这会有所帮助,以防有人遇到同样的麻烦......


查看完整回答
反对 回复 2022-07-14
  • 1 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信