Как настроить c3p0 с Hibernate и JNDI?

У меня есть приложение, развернутое на сервере geronimo, и я использую структуру Hibernate. Я интегрировал с ней библиотеку C3P0, и она отлично работает, когда я изменил URL-адрес базы данных в hibernate.cfg.xml следующим образом:

<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@iddfrvexa.grouperci.com:1574:IDDFRV</property>
        <property name="hibernate.connection.username">iqa</property>
        <property name="hibernate.connection.password">iqaadmin</property>
        <!-- <property name="connection.datasource">java:comp/env/rci_cdofr/jdbc/Datasource</property> -->
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="show_sql">false</property>
        <property name="max_fetch_depth">0</property>
        <property name="hibernate.jdbc.factory_class">net.bull.javamelody.HibernateBatcherFactory</property>

        <!-- <property name="hibernate.dbcp.validationQuery">SELECT 1 FROM DUAL</property> 
            <property name="hibernate.dbcp.testOnBorrow">true</property> -->


        <!-- c3p0 config http://www.hibernate.org/214.html -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <property name="c3p0.min_size">5</property>
        <property name="c3p0.max_size">20</property>
        <property name="c3p0.timeout">1800</property>
        <property name="c3p0.max_statements">50</property>
        <property name = "c3p0.testConnectionOnCheckout">true</property>

но когда я использую jndi следующим образом:

 <property name="connection.datasource">java:comp/env/rci_cdofr/jdbc/Datasource</property>
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="show_sql">false</property>
        <property name="max_fetch_depth">0</property>

        <property name="hibernate.jdbc.factory_class">net.bull.javamelody.HibernateBatcherFactory</property>

        <!-- c3p0 config http://www.hibernate.org/214.html -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <property name="c3p0.min_size">5</property>
        <property name="c3p0.max_size">20</property>
        <property name="c3p0.timeout">1800</property>
        <property name="c3p0.max_statements">50</property>
        <property name = "c3p0.testConnectionOnCheckout">true</property>

c3p0 не работает и появилась ошибка.

и когда я отлаживаю, я обнаружил, что URL-адрес базы данных был нулевым. Кто-нибудь может мне помочь?

Спасибо.

Вполне вероятно, что если вы хотите обернуть существующий источник данных JNDI версией из пула c3p0, вам придется самостоятельно создать этот источник данных на Java, а затем настроить Hibernate для поиска имени JNDI этого

<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@iddfrvexa.grouperci.com:1574:IDDFRV</property>
        <property name="hibernate.connection.username">iqa</property>
        <property name="hibernate.connection.password">iqaadmin</property>
        <!-- <property name="connection.datasource">java:comp/env/rci_cdofr/jdbc/Datasource</property> -->
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="show_sql">false</property>
        <property name="max_fetch_depth">0</property>
        <property name="hibernate.jdbc.factory_class">net.bull.javamelody.HibernateBatcherFactory</property>

        <!-- <property name="hibernate.dbcp.validationQuery">SELECT 1 FROM DUAL</property> 
            <property name="hibernate.dbcp.testOnBorrow">true</property> -->


        <!-- c3p0 config http://www.hibernate.org/214.html -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <property name="c3p0.min_size">5</property>
        <property name="c3p0.max_size">20</property>
        <property name="c3p0.timeout">1800</property>
        <property name="c3p0.max_statements">50</property>
        <property name = "c3p0.testConnectionOnCheckout">true</property>
. Я не думаю, что hibernate поддерживает перенос существующего
 <property name="connection.datasource">java:comp/env/rci_cdofr/jdbc/Datasource</property>
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="show_sql">false</property>
        <property name="max_fetch_depth">0</property>

        <property name="hibernate.jdbc.factory_class">net.bull.javamelody.HibernateBatcherFactory</property>

        <!-- c3p0 config http://www.hibernate.org/214.html -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <property name="c3p0.min_size">5</property>
        <property name="c3p0.max_size">20</property>
        <property name="c3p0.timeout">1800</property>
        <property name="c3p0.max_statements">50</property>
        <property name = "c3p0.testConnectionOnCheckout">true</property>
в пул c3p0 через настройку его _3_.


person abdelmouheimen    schedule 18.09.2018    source источник
comment
java.sql.SQLException: не удалось получить соединения из базовой базы данных! в com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) в com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) в com.mchange.v2.c3p0.impl .AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) в org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78) в org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84) в org.hibernate. cfg.Configuration.buildSettings(Configuration.java:2009) в org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) в com.rcibanque.framework.persistance.hibernate.HibernateUtil.(HibernateUtil.java:45) в com.rcibanque.framework.persistance.hibernate.HibernateTransaction.begin(HibernateTransaction.java:62) на com.rcibanque.common.application.ReferencesService.loadReferences(ReferencesService.java:52) на com.rcibanque.common.start.InitSe rvlet.init(InitServlet.java:46) в javax.servlet.GenericServlet.init(GenericServlet.java:215) в org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1108) в org.apache.catalina .core.StandardWrapper.load(StandardWrapper.java:1010) в org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4413) в org.apache.catalina.core.StandardContext.start(StandardContext.java:4723) ) по адресу org.apache.geronimo.tomcat.GeronimoStandardContext.access$201(GeronimoStandardContext.java:63) по адресу org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:398) по адресу org.apache.geronimo.tomcat .valve.GeronimoBeforeAfterValve.invoke(GeronimoBeforeAfterValve.java:47) в org.apache.geronimo.tomcat.GeronimoStandardContext.start(GeronimoStandardContext.java:251) в org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799 ) на org.apache.catalina.core.Conta inerBase.addChild(ContainerBase.java:779) в org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601) в org.apache.geronimo.tomcat.TomcatContainer.addContext(TomcatContainer.java:369) в org. .apache.geronimo.tomcat.TomcatWebAppContext.doStart(TomcatWebAppContext.java:512) в org.apache.geronimo.gbean.runtime.GBeanInstance.createInstance(GBeanInstance.java:998) в org.apache.geronimo.gbean.runtime. GBeanInstanceState.attemptFullStart(GBeanInstanceState.java:268) в org.apache.geronimo.gbean.runtime.GBeanInstanceState.start(GBeanInstanceState.java:102) в org.apache.geronimo.gbean.runtime.GBeanInstance.start(GBeanInstance.java: 541) в org.apache.geronimo.gbean.runtime.GBeanDependency.attemptFullStart(GBeanDependency.java:111) в org.apache.geronimo.gbean.runtime.GBeanDependency.addTarget(GBeanDependency.java:146) в org.apache.geronimo .gbean.runtime.GBeanDependency$1.running(GBeanDependency.java:120) в org.apache.geronimo.kernel.basic.BasicLifecycleMonitor.fireRunningEvent(BasicLifecycleMonitor.java:176) в org.apache.geronimo.kernel.basic.BasicLifecycleMonitor. access$300(BasicLifecycleMonitor.java:44) в org.apache.geronimo.kernel.basic.BasicLifecycleMonitor$RawLifecycleBroadcaster.fireRunningEvent(BasicLifecycleMonitor.java:254) в org.apache.geronimo.gbean.runtime.GBeanInstanceState.attemptFullStart(GBeanInstanceState.java : 294) в org.apache.geronimo.gbean.runtime.GBeanInstanceState.start(GBeanInstanceState.java:102) в org.apache.geronimo.gbean.runtime.GBeanInstanceState.startRecursive(GBeanInstanceState.java:124) в org.apache.geronimo .gbean.runtime.GBeanInstance.startRecursive(GBeanInstance.java:555) в org.apache.geronimo.kernel.basic.BasicKernel.startRecursiveGBean(BasicKernel.java:379) в org.apache.geronimo.kernel.config.ConfigurationUtil.startConfigurationGBeans (ConfigurationUtil.java:456) в org.apache.geronimo.kernel.config.ConfigurationUtil.startConfigurationGBeans(ConfigurationUtil.java:493) в org.apache.geronimo.kernel.config.KernelConfigurationManager.start(KernelConfigurationManager.java:188) в org.apache.geronimo.kernel.config.SimpleConfigurationManager.startConfiguration(SimpleConfigurationManager.java:563) в org.apache.geronimo.kernel.config.SimpleConfigurationManager.startConfiguration(SimpleConfigurationManager.java:544) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method. invoke(Method.java:606) в org.apache.geronimo.gbean.runtime.ReflectionMethodInvoker.invoke(ReflectionMethodInvoker.java:34) в org.apache.geronimo.gbean.runtime.GBeanOperation.invoke(GBeanOperation.java:124) на org.apache.geronimo.gbean.runtime. GBeanInstance.invoke(GBeanInstance.java:867) в org.apache.geronimo.kernel.basic.BasicKernel.invoke(BasicKernel.java:239) в org.apache.geronimo.kernel.KernelGBean.invoke(KernelGBean.java:342) at sun.reflect.GeneratedMethodAccessor163.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.geronimo .gbean.runtime.ReflectionMethodInvoker.invoke(ReflectionMethodInvoker.java:34) в org.apache.geronimo.gbean.runtime.GBeanOperation.invoke(GBeanOperation.java:124) в org.apache.geronimo.gbean.runtime.GBeanInstance.invoke (GBeanInstance.java:867) в org.apache.geronimo.kernel.basic.BasicKernel.invoke(BasicKernel.java:239) в org.apache.geronimo.system.jmx.MBeanGBeanBridge.invoke(MBeanGBeanBridge.java:172) в com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) по адресу com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) в javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1487) в javax.management.remote.rmi.RMIConnectionImpl.access$300 (RMIConnectionImpl.java:97) в javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1328) в java.security.AccessController.doPrivileged(собственный метод) в javax.management.remote.rmi.RMIConnectionImpl .doPrivilegedOperation(RMIConnectionImpl.java:1427) на javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:848) на sun.reflect.GeneratedMethodAccessor150.invoke(Неизвестный источник) на sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorAccess) .java:43) в java.lang.reflect.Method.invoke(Method.java:606) в sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) в sun.rmi.transport.Transport$1.run (Transport.java:177) на sun.r mi.transport.Transport$1.run(Transport.java:174) в java.security.AccessController.doPrivileged(собственный метод) в sun.rmi.transport.Transport.serviceCall(Transport.java:173) в sun.rmi.transport .tcp.TCPTransport.handleMessages(TCPTransport.java:556) в sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) в sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport .java:670) в java.util.concurrent. ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:745) Вызвано: com.mchange .v2.resourcepool.CannotAcquireResourceException: ResourcePool не может получить ресурс из своей основной фабрики или источника. в com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) в com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) в com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource (BasicResourcePool.java:477) в com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ... еще 82   -  person AntJavaDev    schedule 24.09.2018


Ответы (1)


Java-сторона упаковки источника данных без пула действительно проста в c3p0. Просто получите ссылку на свой существующий не объединенный DataSource и используйте его вместо ds_unpooled.

Как упоминалось в ответе ниже, вы не можете обернуть ресурс сервера, что не является основной идеей. Представьте себе, что если каждое приложение может обернуть это, то опять же, зачем вам вообще нужен общий ресурс. Поэтому, возможно, вам придется пересмотреть общий поток и правильно настроить пул источников данных в конфигурации сервера. Также обратите внимание, что ваш первый пример работает, потому что ваше приложение просто определяет свой собственный источник данных и не зависит от ресурсов сервера.

person Steve Waldman    schedule 23.09.2018