MySQL连接不适用于HikariCP

时间:2017-05-01 13:31:44

标签: java mysql database jdbc hikaricp

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 Datasource进行连接。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

方法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)