如何在 Spring(4) 上下文中为 HSQL 配置 Hikari CP?
Posted
技术标签:
【中文标题】如何在 Spring(4) 上下文中为 HSQL 配置 Hikari CP?【英文标题】:How to configure Hikari CP for HSQL in a Spring(4) context? 【发布时间】:2014-04-29 16:06:20 【问题描述】:我想在我的 Spring 4.0.3 上下文中使用 Hikari CP,但我似乎遗漏了一些东西。
我的 bean 配置如下:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg>
<bean class="com.zaxxer.hikari.HikariConfig">
<constructor-arg>
<props>
<prop key="dataSource.driverClassName">$database.driver</prop>
<prop key="dataSource.jdbcUrl">$database.database.jdbc.url</prop>
<prop key="dataSource.port">$database.port</prop>
<prop key="dataSource.databaseName">$database.name</prop>
<prop key="dataSource.user">$database.user</prop>
<prop key="dataSource.password">$database.password</prop>
</props>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
但我得到一个例外:
Caused by: java.lang.IllegalArgumentException: one of either dataSource or dataSourceClassName must be specified
at com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:655)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:66)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
... 15 more
我已尝试使用 HSQL org.hsqldb.jdbc.JDBCDataSource 配置 dataSourceClassName
那样:
<prop key="dataSourceClassName">org.hsqldb.jdbc.JDBCDataSource</prop>
也是这样:
<prop key="dataSource.ClassName">org.hsqldb.jdbc.JDBCDataSource</prop>
两次我都遇到了以下异常:
Caused by: java.lang.RuntimeException: java.beans.IntrospectionException: Method not found: setPort
at com.zaxxer.hikari.util.PropertyBeanSetter.setProperty(PropertyBeanSetter.java:109)
at com.zaxxer.hikari.util.PropertyBeanSetter.setTargetFromProperties(PropertyBeanSetter.java:61)
at com.zaxxer.hikari.pool.HikariPool.initializeDataSource(HikariPool.java:497)
... 23 more
Caused by: java.beans.IntrospectionException: Method not found: setPort
at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:110)
at com.zaxxer.hikari.util.PropertyBeanSetter.setProperty(PropertyBeanSetter.java:97)
... 25 more
有人可以向我展示一个Hikari CP Spring 4 bean 配置,该配置与 HSQL DB 一起工作?
我对 mysql、PG 等不感兴趣,因为我知道如何让它们工作。但我无法用 HSQL 完成它。
谢谢,
使用的技术:Java8、Spring 4.0.3、HSQL 2.3.2
【问题讨论】:
【参考方案1】:完成工作的一种方法是提供一个 DataSource 对象的实例:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg>
<bean class="com.zaxxer.hikari.HikariConfig">
<property name="dataSource">
<bean class="org.hsqldb.jdbc.JDBCDataSource">
<property name="url" value="$database.database.jdbc.url"/>
<property name="databaseName" value="$database.name"/>
<property name="user" value="$database.user"/>
<property name="password" value="$database.password"/>
</bean>
</property>
</bean>
</constructor-arg>
</bean>
当然还有其他解决方案。
HTH,
【讨论】:
不确定如果将 databaseName 与 JDBC url 一起使用(已包含数据库引用)来复制会发生什么。 【参考方案2】:如果您使用的是驱动程序类,则示例中的某些属性不需要前缀“dataSource”。
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg>
<bean class="com.zaxxer.hikari.HikariConfig">
<constructor-arg>
<props>
<prop key="driverClassName">$database.driver</prop>
<prop key="jdbcUrl">$database.database.jdbc.url</prop>
<prop key="username">$database.user</prop>
<prop key="password">$database.password</prop>
</props>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
并且port
和databaseName
可以包含在jdbcUrl
中。
【讨论】:
【参考方案3】:对于纯 Java 配置解决方案,我使用了以下内容(在带有 @Configuration
注释并包含在组件扫描路径中的类中):
...
@Bean
public DataSource dataSource()
return new HikariDataSource(hikariConfig());
private HikariConfig hikariConfig()
HikariConfig config = new HikariConfig();
config.setDriverClassName(driverClassName);
config.setJdbcUrl(jdbcUrl);
config.setUsername(username);
config.setPassword(password);
return config;
...
HTH
【讨论】:
正如我已经提到的,工作正常,问题出在基于 xml 的配置中【参考方案4】:在 HikariCP 2.3.8 和 Hibernate 4.3.8 下测试。Final:
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<constructor-arg>
<props>
<prop key="dataSourceClassName">org.postgresql.ds.PGSimpleDataSource</prop>
<prop key="dataSource.user">$database.username</prop>
<prop key="dataSource.password">$database.password</prop>
<prop key="dataSource.databaseName">$database.databaseName</prop>
<prop key="dataSource.serverName">$database.serverName</prop>
<prop key="connectionTestQuery">SELECT 1</prop>
</props>
</constructor-arg>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikariConfig" />
</bean>
对于dataSourceClassName,查看popular datasource class names table。
ConnectionTestQuery 根据https://github.com/brettwooldridge/HikariCP/issues/225,对于 postgresql 是必需的,在使用最新的 jdbc 驱动程序版本时不需要。
【讨论】:
以上是关于如何在 Spring(4) 上下文中为 HSQL 配置 Hikari CP?的主要内容,如果未能解决你的问题,请参考以下文章
使用 jdbc:embedded-database 时如何连接到 Spring 创建的 HSQL?