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进行连接。
有什么想法吗?
答案 0 :(得分:4)
方法HikariConfig.getDataSource()
没有按照您的想法执行。它没有为您提供Hikari DataSource
,它返回您自己设置的(非池)数据源(如果有的话);您尚未在代码中执行此操作,因此返回null
。
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)