在tomcat上与hibernate和mysql共享c3p0连接池

Posted

技术标签:

【中文标题】在tomcat上与hibernate和mysql共享c3p0连接池【英文标题】:shared c3p0 connection pool with hibernate and mysql on tomcat 【发布时间】:2017-12-01 18:24:04 【问题描述】:

我正在做一个项目,我想在 tomcat 上使用休眠配置 共享连接 池。 该项目已经实施,我必须改变它。 它配置了 hibernate 和 c3p0 连接池,所有 jar 都在项目本身中。

我将所有用于连接池的 jar 文件复制到 tomcatlib 文件夹中。

    c3p0-0.9.5.2.jar c3p0-oracle-thin-extras-0.9.5.2.jar mchange-commons-java-0.2.11.jar mysql-connector-java-5.1.40-bin.jar

server.xml 我做了一个资源

<Resource auth="Container"
      description="DB Connection"
      driverClass="com.mysql.jdbc.Driver"
      maxPoolSize="40"
      minPoolSize="10"
      acquireIncrement="1"
      name="jdbc/test"
      user="admin"
      password="root"
      factory="org.apache.naming.factory.BeanFactory"
      type="com.mchange.v2.c3p0.ComboPooledDataSource"
      jdbcUrl="jdbc:mysql://localhost:3306/testDB" />
      

       <ResourceLink
 global="jdbc/test"
 name="jdbc/test"
 type="javax.sql.DataSource" />  

在此之后我可以看到我的连接由 phpmyadmin(mysql) 中的池创建。

在我创建的项目的 web.xml 文件中 资源引用。`

  <resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/testDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
`

还有我的 hibernate.cfg.xml 文件 `

  </hibernate-configuration>
  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="connection.datasource">java:comp/env/jdbc/testDB</property>
  <mapping resource="Database.hbm.xml"/>
  </hibernate-configuration>

这就是我迄今为止所做的。我的问题是。在我的项目中,我有一个 sessionfactory,我在其中设置了 hibernate.cfg.xml 和 Database.hbm.xml 文件。 这现在给了我一个 java.lang.NullPointerException

我是否必须在 tomcat 上也将 sessionfactory 配置为资源?

在 Tomcat:

 Jun 29, 2017 10:06:19 AM org.apache.catalina.mbeans.GlobalResourcesLifecycleListener createMBeans
SCHWERWIEGEND: Exception processing Global JNDI Resources
javax.naming.NamingException: Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: myutil.hibernate.HibernateSessionFactoryTomcatFactory]
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:82)
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:842)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
    at org.apache.naming.NamingContextBindingsEnumeration.nextElementInternal(NamingContextBindingsEnumeration.java:117)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:71)
    at org.apache.naming.NamingContextBindingsEnumeration.next(NamingContextBindingsEnumeration.java:34)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:138)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:145)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.createMBeans(GlobalResourcesLifecycleListener.java:110)
    at org.apache.catalina.mbeans.GlobalResourcesLifecycleListener.lifecycleEvent(GlobalResourcesLifecycleListener.java:82)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
Caused by: java.lang.ClassNotFoundException: myutil.hibernate.HibernateSessionFactoryTomcatFactory
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:80)
    ... 23 more

 
Jun 29, 2017 10:06:17 AM org.apache.tomcat.util.digester.Digester endElement
WARNUNG:   No rules found matching 'Server/GlobalNamingResources/ResourceLink'.
Jun 29, 2017 10:06:17 AM org.apache.catalina.core.AprLifecycleListener init
INFORMATION: The APR based Apache Tomcat Native library which allows optimal
 performance in production environments was not found on the java.library.path:

编辑

我还没有提到,我正在使用 OSGI Equinox 和 servlet 桥接器。 我配置的一切都是正确的,我唯一需要改变的就是改变我的 launch.ini 我有:

osgi.parentClassloader=app
osgi.contextClassLoaderParent=app

改成

osgi.parentClassloader=app
osgi.contextClassLoaderParent=fwk <--- changed

here a link where i got my help from

也使用 java:/comp/env/jdbc/testDBcomp 解决我的问题之前使用斜线

【问题讨论】:

【参考方案1】:

在您的 server.xml 中更改为:

 <Resource auth="Container"
  description="DB Connection"
  driverClass="com.mysql.jdbc.Driver"
  maxPoolSize="40"
  minPoolSize="10"
  acquireIncrement="1"
  name="jdbc/testDB" <!-- change -->
  user="admin"
  password="root"
  factory="org.apache.naming.factory.BeanFactory"
  type="com.mchange.v2.c3p0.ComboPooledDataSource"
  jdbcUrl="jdbc:mysql://localhost:3306/testDB" />

和:

 <ResourceLink
  global="jdbc/testDB" <!--change -->
  name="jdbc/testDB"   <!-- & change -->
  type="javax.sql.DataSource" />  

和你的 hibernate.cfg.xml 文件到

 <hibernate-configuration>
  <session-factory>
   <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
   <property name="connection.datasource">java:comp/env/jdbc/testDB</property> <!-- ? -->
  <mapping resource="Database.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

重启catalina。

【讨论】:

一个项目中可以有多个 SessionFactory 或 EntityManager ,每个 SessionFactory 用于一个&一个 Pool 连接,服务器中可以有多个 Pool。 SessionFactory 在项目中而不是在服务器中链接和配置【参考方案2】:
osgi.parentClassloader=app
osgi.contextClassLoaderParent=app

改成

osgi.parentClassloader=app
osgi.contextClassLoaderParent=fwk <--- changed

here 一个链接,当我遇到 NoInitialContextException 时,我从中获得了帮助。

javax.naming.NoInitialContextException:Cannot instantiate class: org.apache.naming.java.javaURLContextFactory (root cause classnotfound for org.apache.naming.java.javaURLContextFactory)

还使用 java:/comp/env/jdbc/testDB 而不是 java:comp/env/jdbc/testDB(在 /comp 之前使用斜线strong>) 解决了我在 linux tomcat 服务器上遇到的另一个问题(JNDI 查找异常):

NameNotFoundException.

【讨论】:

以上是关于在tomcat上与hibernate和mysql共享c3p0连接池的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat/Hibernate 与 MySql 的连接失败,出现“通信链接失败”和“权限被拒绝”

MySQL 连接超时问题 - 使用 Hibernate 和 ORM 的 Tomcat 上的 Grails 应用程序

我可以在同一台服务器上与 tomcat 一起运行 Xampp

Tomcat、Hibernate 和 java.io.EOFException

tomcat 7.0.42 pooling, hibernate 4.2, mysql 坚如磐石的自动重新连接解决方​​案

全面开启线上参会报名!CNCC线上与现场参会者共赴技术盛宴!