当前位置: 首页 > 知识库问答 >
问题:

通过Spring Boot使用具有不同jdbc驱动程序的两个数据源

袁桐
2023-03-14

我遵循留档并创建了一些与给定示例完全相同的源代码。当我运行我的代码时,我得到了这个异常:

Java语言lang.RuntimeException:驱动程序组织。mariadb。jdbc。驱动程序声称不接受jdbcUrl,jdbc:h2:mem:testdb;DB\U CLOSE\U DELAY=-1;DB\u CLOSE\u ON\u EXIT=FALSE

奇怪的是有两种东西混合在一起:

  • h2 jdbcUrl由mariaDB驱动程序处理

这些是我的豆子:

@Bean
@Primary
@ConfigurationProperties("datasources.first")
public DataSourceProperties firstDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@Primary
@ConfigurationProperties("datasources.first.configuration")
public HikariDataSource firstDataSource() {
    return firstDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}

@Bean
@ConfigurationProperties("datasources.second")
public DataSourceProperties secondDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("datasources.second.configuration")
public HikariDataSource secondDataSource() {
    return secondDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}

我的application.yml是这样的:

datasources:
  first:
    jdbcUrl: jdbc:mariadb://...
    username: ...
    password: ...
    driver-class-name: org.mariadb.jdbc.Driver
  second:
    jdbcUrl: jdbc:h2:/tmp/test;DB_CLOSE_ON_EXIT=FALSE
    username: ...
    password: ...
    driver-class-name: org.h2.Driver

这是导致异常的代码:

@Component
public class Updater {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    Queries queries;

    public List<User> getActiveUsers() throws Exception {
        List<User> users = jdbcTemplate.query(queries.getActive(), new UserRowMapper());

        return users;
    }

为了进一步诊断这个问题,我启用了configprops和beanendpoint,并检查了它们的输出。配置看起来不错,bean也不错:

配置(众多配置之一):

    "firstDataSourceProperties": {
      "prefix": "datasources.first",
      "properties": {
        "password": "******",
        "initializationMode": "EMBEDDED",
        "driverClassName": "org.mariadb.jdbc.Driver",
        "generateUniqueName": false,
        "xa": {
          "properties": {}
        },
        "separator": ";",
        "platform": "all",
        "continueOnError": false,
        "username": "..."
      }

Bean(众多Bean之一):

"firstDataSource": {
          "aliases": [],
          "scope": "singleton",
          "type": "com.zaxxer.hikari.HikariDataSource",
          "resource": "...Application",
          "dependencies": [
            "firstDataSourceProperties"
          ]
        }

我使用Spring Boot 2.2.6

共有1个答案

钮实
2023-03-14

这个问题是由于我不理解数据源属性和HikariDataSource之间的相互作用造成的。

我发现jdbcUrl没有携带我配置的值,这可以从firstDataSource的详细信息中看到:

"firstDataSource": {
  "prefix": "datasources.first.configuration",
  "properties": {
    "initializationFailTimeout": 1,
    "validationTimeout": 5000,
    "readOnly": false,
    "registerMbeans": false,
    "healthCheckProperties": {},
    "isolateInternalQueries": false,
    "leakDetectionThreshold": 0,
    "maxLifetime": 1800000,
    "minimumIdle": 10,
    "metricsTrackerFactory": {},
    "allowPoolSuspension": false,
    "idleTimeout": 600000,
    "dataSourceProperties": {},
    "driverClassName": "org.mariadb.jdbc.Driver",
    "jdbcUrl": "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE",
    "loginTimeout": 0,
    "maximumPoolSize": 10,
    "autoCommit": true,
    "connectionTimeout": 30000,
    "username": "...",
    "poolName": "HikariPool-1"
}

如您所见,jdbcUrl地址为h2。这是因为我在数据源中设置了“我的”预期url。第一jdbcUrl。但在此之后,数据源的(不存在)值。第一配置已读取未配置的jdbcUrl,显然已设置为默认值。

我改变我的application.yml后,它的工作:

datasources:
  first:
    username: ...
    password: ...
    driver-class-name: org.mariadb.jdbc.Driver
    configuration:
      jdbcUrl: jdbc:mariadb://...

我需要决定将哪个值放在哪里,用户名和密码也可以移到更深一层,但这是另一回事。。。

 类似资料:
  • 问题内容: 我正在尝试使用JDBC驱动程序将android应用程序连接到服务器(PostgreSQL),但是出现此错误: 我尝试了很多事情,例如在路径中添加驱动程序的地址,但没有任何效果。我遵循了本教程:http : //appliedcoffeetechnology.tumblr.com/post/10657124340,并在构建路径中添加了驱动程序JDBC4(我也尝试过JDBC3)。 每个人都

  • 对于InterClient7.5.1和8.1.5,在Java8中创建新的JDBC连接失败 此类似乎被InterClientJDBC库引用或使用。Java7不会发生错误。是否有方法解决此错误? 此代码重现了Java 8上的问题: 输出: interbase.interclient.Connection处线程“main”java.lang.NoClassDefFoundError:sun/io/Byt

  • TL;DR:同时使用Hive和MySql JDBC有问题吗? 我正在开发一个应用程序,它使用MySql JDBC驱动程序执行多个SQL查询,然后它还使用Hive JDBC发送另一个Hive查询。 现在发生的情况是,MySql查询正常工作,当代码尝试执行配置单元查询时,它会抛出以下异常: 现在,在抛出这个异常之后,查询将正确执行。 我的猜测是,由于我同时加载了MySql和Hive驱动程序,MySql

  • 我正在尝试使用tomcat jdbc连接池,并在我的应用程序context.xml文件中定义了它。 类<code>net.sf.log4jdbc。DriverSpy是在<code>log4jdbc4-1.2.jar Tomcat使用它的类加载驱动程序: 为null,并且正在尝试通过加载驱动程序类。据我所知,在这种情况下,驱动程序类正在加载与相同的类加载器实例。这是,如果我的jar在tomcat库中

  • 我正在尝试使用本教程连接Oracle数据库。当我使用命令行:java-cp c:\jdbc-test\ojdbc6.jar;c:\jdbc-test OracleJDBC我已经将ojdbc6.jar与OracleJDBC.java放在同一个文件夹中。现在我需要在Eclipse上运行它,但它给我一个错误: 是因为OJDBC6.jar位置吗?

  • 我正在尝试在android应用程序中使用JDBC连接到SQL Server。我导入了sqljdbc4。jar进入我的应用程序,但当我 conn=驾驶员管理器。getConnection(连接字符串); 我得到下面的错误:连接字符串是 jdbc:sqlserver://xxx.xxx.xxx.xxx:1433;加密=快速;用户=用户名;密码=密码; 谁能告诉我出了什么问题吗?如果我将相同的代码放入常