java - 无法使用 C3P0 在 Karaf 中创建 JPA 连接池

标签 java hibernate jpa jdbc apache-karaf

无法使用 C3P0 创建 Hibernate-JPA 连接池。遇到如下错误日志:

com.employee.mgmt.sys.db.provider.EmployeeDBProvider(30)] The activate method has thrown an exception org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:261)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:225)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
    at org.hibernate.osgi.OsgiPersistenceProvider.createContainerEntityManagerFactory(OsgiPersistenceProvider.java:112)
    at org.apache.aries.jpa.container.impl.AriesEntityManagerFactoryBuilder.createEntityManagerFactory(AriesEntityManagerFactoryBuilder.java:55)
    at com.employee.mgmt.sys.db.provider.EmployeeDBProvider.createEntityManagerFactoryObjects(EmployeeDBProvider.java:63)
    at com.employee.mgmt.sys.db.provider.EmployeeDBProvider.activate(EmployeeDBProvider.java:35)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

[:1.8.0_121] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_121] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_121]
    at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_121]
    at org.apache.felix.scr.impl.inject.BaseMethod.invokeMethod(BaseMethod.java:224)[73:org.apache.felix.scr:2.0.6]
    at org.apache.felix.scr.impl.inject.BaseMethod.access$500(BaseMethod.java:39)[73:org.apache.felix.scr:2.0.6]
    at org.apache.felix.scr.impl.inject.BaseMethod$Resolved.invoke(BaseMethod.java:617)[73:org.apache.felix.scr:2.0.6]
    at org.apache.felix.scr.impl.inject.BaseMethod.invoke(BaseMethod.java:501)[73:org.apache.felix.scr:2.0.6]
    at org.apache.felix.scr.impl.inject.ActivateMethod.invoke(ActivateMethod.java:302)[73:org.apache.felix.scr:2.0.6]
    at org.apache.felix.scr.impl.inject.ActivateMethod.invoke(ActivateMethod.java:294)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:297)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:108)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:906)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:879)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:748)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:674)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:429)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:657)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:341)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:403)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.Activator.access$200(Activator.java:54)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:278)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:259)[73:org.apache.felix.scr:2.0.6] 
    at org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:232)[73:org.apache.felix.scr:2.0.6] 
    at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482)[org.osgi.core-6.0.0.jar:] 
    at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:415)[org.osgi.core-6.0.0.jar:] 
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232)[org.osgi.core-6.0.0.jar:] 
    at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)[org.osgi.core-6.0.0.jar:] 
    at org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915)[org.apache.felix.framework-5.6.1.jar:] 
    at org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834)[org.apache.felix.framework-5.6.1.jar:] 
    at org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516)[org.apache.felix.framework-5.6.1.jar:] 
    at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4541)[org.apache.felix.framework-5.6.1.jar:] 
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2172)[org.apache.felix.framework-5.6.1.jar:] 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)[org.apache.felix.framework-5.6.1.jar:] 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)[org.apache.felix.framework-5.6.1.jar:] 
    at org.apache.karaf.bundle.command.Install.execute(Install.java:96)[23:org.apache.karaf.bundle.core:4.0.8] 
    at org.apache.karaf.shell.impl.action.command.ActionCommand.execute(ActionCommand.java:83)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:67)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:87)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)[43:org.apache.karaf.shell.core:4.0.8] 
    at org.apache.karaf.shell.impl.console.ConsoleSessionImpl.run(ConsoleSessionImpl.java:274)[43:org.apache.karaf.shell.core:4.0.8] 
    at java.lang.Thread.run(Thread.java:745)

[:1.8.0_121] Caused by: org.hibernate.HibernateException: Could not instantiate connection provider [org.hibernate.c3p0.internal.C3P0ConnectionProvider] 
    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:197)
    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:120) 
    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:55) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:105) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:251) ... 64 more 

Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.c3p0.internal.C3P0ConnectionProvider] as strategy [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] 
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:128) 
    at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:194) ... 68 more

请求提供如何在 Karaf 中使用 JPA 创建连接池的解决方案。

最佳答案

仔细检查您提供的错误堆栈跟踪后,我猜问题与您使用的 hibernate.c3po.* 属性有关。

您可能需要引用此documentation :

C3P0ConnectionProvider

A connection provider that uses a C3P0 connection pool. Hibernate will use this by default if the hibernate.c3p0.* properties are set

最好将这些参数全部单独放入 c3p0 配置文件中,而不是使用 hibernate.c3p0.* 属性。

一个简单的配置文件可帮助您填写这些详细信息:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
    <property name="initialPoolSize">5</property>
    <property name="minPoolSize">5</property>
    <property name="maxPoolSize">10</property>
    <property name="checkoutTimeout">3000</property>
    <property name="maxStatementsPerConnection">30</property>

    <property name="preferredTestQuery">SELECT 1 FROM DUAL</property>
    <property name="testConnectionOnCheckin">true</property>
    <property name="testConnectionOnCheckout">false</property>
    <property name="idleConnectionTestPeriod">300</property>
    </default-config>
</c3p0-config>

希望这有帮助!!!

关于java - 无法使用 C3P0 在 Karaf 中创建 JPA 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43668368/

相关文章:

java - Spring 集成: Allocate Space when sending file to FTP

java - 如何在jmeter中打开多个jmx文件?

java - Java 中的 MariaDB 动态列集成

java - 如何使用 JPA Criteria API 在日期字段中搜索字符串

java - JPA 和 google app engine 中的多对多关系

java - 在 Java 中定义嵌套类/对象/枚举结构的最佳方法是什么?

java - 从 Lucene 索引中获取最高频率的术语

java - 更新多行 - Hibernate

java - 如何使用 Spring Boot 启用 hibernate.generate_statistics?

java - 在 JPA 范围内以编程方式构建 HQL 查询 "non-dynamic"