java - 使用 hikaricp 启动 Spring Boot 时遇到问题

标签 java spring spring-boot spring-jdbc hikaricp

正如一些博客所建议的那样,我也做了同样的事情。但我仍然无法解决这个问题。

环境:

spring - 4.2.5.RELEASE
spring boot - 1.3.3.RELEASE
hikariCP - 2.4.7

@Bean(name="HikariDataSource",destroyMethod = "shutdown")
    public DataSource dataSource2() {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName("oracle.jdbc.OracleDriver");
        config.setJdbcUrl("");
        config.setUsername("");
        config.setPassword("");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        config.setPoolName("Hikaripool-1");

        HikariDataSource ds = new HikariDataSource(config);
        return ds;
    }
        @Bean
    public JdbcTemplate getJdbcTemplate() {

        return new JdbcTemplate(dataSource2());
    }

异常(exception):

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [HikariDataSource (null)] with key 'dataSource'; nested exception is javax.management.InstanceAlreadyExistsException: com.zaxxer.hikari:name=dataSource,type=HikariDataSource
Caused by: javax.management.InstanceAlreadyExistsException: com.zaxxer.hikari:name=dataSource,type=HikariDataSource

谁能帮我解决这个问题。

最佳答案

错误“InstanceAlreadyExistsException: com.zaxxer.hikari:name=dataSource”意味着数据源还存在一个实例。请检查您的配置。 以下是使用 HikariCP、Spring Boot 1.4.0 和 hsqldb 的 jdbcTemplate 示例代码。请检查下面的 HikariCPConnTest.java。希望这会有所帮助。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Spring-HikariCP</groupId>
<artifactId>com.my</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
    <relativePath />
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
    </dependency>
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
  </dependencies>
</project>

application.properties

spring.datasource.driverClassName=org.hsqldb.jdbc.JDBCDriver
spring.datasource.url=jdbc:hsqldb:mem:testdb
spring.datasource.username=sa
spring.datasource.password=

HikariCPConn.java

import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Component
@ConfigurationProperties
public class HikariCPConn {

@Value("${spring.datasource.driverClassName}")
private String driverClassName;

@Value("${spring.datasource.url}")
private String url;

@Value("${spring.datasource.username}")
private String user;

@Value("${spring.datasource.password}")
private String password;

@Bean
public DataSource getDataSource() {
    HikariConfig hikariConfig = new HikariConfig();
    hikariConfig.setUsername(user);
    hikariConfig.setPassword(password);
    hikariConfig.setDriverClassName(driverClassName);
    hikariConfig.setJdbcUrl(url);
    return new HikariDataSource(hikariConfig);
}

@Bean
public JdbcTemplate getJdbcTemplate() {
    return new JdbcTemplate(getDataSource());
   }
}

MySpringBootApp.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MySpringBootApp {
    public static void main(String[] args) {
    SpringApplication.run(new Object[] { MySpringBootApp.class }, args);

   }
}

HikariCPConnTest.java

import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MySpringBootApp.class)
public class HikariCPConnTest {

@Autowired
HikariCPConn hkConn;

@Test
public void testInsert() {
    JdbcTemplate jt = hkConn.getJdbcTemplate();
    jt.execute("create table employee (id int, name varchar(20))");
    jt.execute("insert into employee (id, name) values (1, 'Emp1')");
    jt.execute("insert into employee (id, name) values (2, 'Emp2')");
    List<Map<String, Object>> data = jt.queryForList("select * from employee");
    assertEquals(2,data.size());
    for (Map map : data) {
        System.out.println(map);
       }
   }
}

关于java - 使用 hikaricp 启动 Spring Boot 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39187860/

相关文章:

spring-boot - 带有 spring : know the message is publish or not? 的 PubSub

java - HTTP 状态 404 - 在创建 Spring Boot 应用程序时未找到

java - 为什么 JMenuItem 上的这个 Actionlistener 没有执行?

java - 如何在没有管理员用户的情况下通过 JNDI 在 Active Directory 中更改过期密码

json - 使用 Gson 将具有 under_score 的 JSON 属性转换为具有 lowerCamel 属性的 DTO

java - Hibernate约束违反异常挂起sql server

java - 使用 spring boot 实现 2 路 SSL

java - Spring boot - 有没有办法为给定的配置文件禁用 AOP?

java - 如何将jrtx文件中定义的特定外部样式应用到iReport?

spring - 实现 Spring Integration 日志记录 channel 适配器来监控所有应用程序