【问题标题】:MySQL connection doesn't work with HikariCPMySQL 连接不适用于 HikariCP
【发布时间】:2017-09-28 22:00:56
【问题描述】:

HikariCP 版本:2.6.1
JDK版本:1.8.0_111
数据库:MySQL
驱动版本:5.1.6


这是我的代码:

HikariConfig config = new HikariConfig();
config.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
config.setUsername("root");
config.setPassword("root");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
System.out.println("Hikari datasource: " + config.getDataSource());

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase?"
        + "user=root&password=root");
System.out.println("Conn: " + conn);
String select = "SELECT * FROM users WHERE email = ? AND enable = 'Y'";
PreparedStatement ps = conn.prepareStatement(select);
ps.setString(1, "myemail@gmail.com");
ResultSet rs = ps.executeQuery();
System.out.println(rs.next());

System.out.println( "Hikari datasource: " + config.getDataSource() ); 行返回 null,System.out.println( rs.next() ); 行返回 true。

换句话说,Hikari 连接由于某种原因无法正常工作。我也可以使用 Wildfly 数据源进行连接。

有什么想法吗?

【问题讨论】:

    标签: java mysql database jdbc hikaricp


    【解决方案1】:

    HikariConfig.getDataSource() 方法并没有像你想象的那样做。它不会为您提供 Hikari DataSource,它会返回您自己设置的(非池化)数据源(如果有);你没有在你的代码中完成,所以它返回null

    documentation中指定:

    dataSource
    此属性仅可通过编程配置或 IoC 容器获得。此属性允许您直接将DataSource 的实例设置为由池包装,而不是让 HikariCP 通过反射构造它。这在一些依赖注入框架中很有用。指定此属性时,dataSourceClassName 属性和所有特定于 DataSource 的属性将被忽略。 默认:无

    要创建 Hikari 数据源,您需要使用:

    HikariDataSource ds = new HikariDataSource(config);
    

    那么你应该使用DriverManager来获取连接,而是使用数据源:

    ds.getConnection()
    

    另见the initialization example on the HikariCP page

    另外:请确保您正确关闭连接(这会将连接返回到池),您当前的代码不会这样做。最简单的事情(在 Java 7 或更高版本中)是使用 try-with-resources:

    try (Connection conn = ds.getConnection()) {
        // use conn...
    }
    // conn will have been automatically closed (returned to the pool)
    

    【讨论】:

    • 嗨,马克,感谢您抽出宝贵时间。您的解决方案效果很好。只是为了注册一个笔记,我还必须添加 config.addDataSourceProperty("databaseName", "mydatabase"); 才能连接到数据库,否则我会得到 No selected database exception...
    • @LeandroBortolotto 我不希望你在 URL 中也指定数据库,但我通常不使用 MySQL,但如果你使用驱动程序 5.1.6,你可能要考虑更新(5.1.6 9+),最新版本是 5.1.42
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 2016-01-03
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多