hibernate和tomcat的连接池问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate和tomcat的连接池问题相关的知识,希望对你有一定的参考价值。

技术总监让我实现一个连接池,说怕把客户的oracle搞崩了,
这样的话是不是需要在hibernate里面配一个连接池,
因为我项目当中即用了hibernate也用了JDBC,那么如果配hibernate的话我用JDBC实现查询功能的时候依然还是新建连接的啊,是否即要在tomcat里面配置连接池,也需要在hibernate里面配置连接池.
如果是的话,应该怎么配!请高手回答,肃然起敬!!!紧急.........

(1)“技术总监让我实现一个连接池,说怕把客户的oracle搞崩了,”,什么意思?不用连接池就能把数据库搞崩了?除非你每次获得连接后,从不释放。
(2)你的技术总监让你实现一个连接池,更是“闭门造车”,现在开源的连接池一大把,c3p0,DBCP等。
(3)你使用hibernate就不用考虑连接池,他本身就带有连接池。追问

(1)他就是怕 没有释放
(2)就是让我用开源的,以前没有弄过,所以不会,才上来问
(3)我用的是hibernate2 听说hibernate2的池连有bug,所以不用它自带的
我问的根本就不是这些
我是问如果在hibernate里面配置了以后 是不是tomcat就不用配置了
第二个是hibernate怎么配
正面回答问题

追答

hibernate.connection.provider_class 配置多种连接池。
(1)你要是用开源的,例如使用DBCP,直接配置成net.sf.hibernate.connection.DBCPConnectionProvider 即可,tomcat不用配。
(2)如果使用jndi,也就是说使用应用程序服务器的数据源,属性配置为org.hibernate.connection.DatasourceConnectionProvider同时还需配置hibernate.connect.jndi的jndi,当然应用程序服务器也要配置数据源,至于tomcat怎么配置数据源,你去查查吧
以上,但愿你能理解。

参考技术A 在hibernate里面配置就可以了.tomcat不用配..追问

那我用JDBC的时候没有经过hibernate啊 connection还是JDBC的 这样可以么
???

追答

不可能啊.
hibernate就是通过JDBC跟数据库打交道的.

Tomcat 8、HikariCP、Hibernate 和 MySQL

【中文标题】Tomcat 8、HikariCP、Hibernate 和 MySQL【英文标题】:Tomcat 8, HikariCP, Hibernate and MySQL 【发布时间】:2016-10-13 23:37:33 【问题描述】:

使用连接池

我正在使用 Hikari 连接池与基于 Java 的 Web 项目中的 MySQl 数据库后端进行交互。我决定将库版本升级到最新的稳定版本,现在我无法再连接到数据库了。

Java 8 MySQL 5.7 雄猫 8

依赖关系

我使用以下 Maven 依赖项:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>2.4.5</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-hikaricp</artifactId>
    <version>5.2.0.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.0.Final</version>

</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>5.2.0.Final</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.2</version>
</dependency>

休眠

项目编译良好,没有缺少库。这是我的休眠配置文件:

<session-factory>

    <property name="hibernate.connection.provider_class">com.zaxxer.hikari.hibernate.HikariConnectionProvider</property>
    <property name="hibernate.hikari.dataSourceClassName">com.mysql.jdbc.jdbc2.optional.MysqlDataSource</property>
    <property name="hibernate.hikari.dataSource.url">jdbc:mysql://localhost:3306/CitationUserDB?useSSL=false</property>
    <property name="hibernate.hikari.dataSource.user">dbUser</property>
    <property name="hibernate.hikari.dataSource.password">vErYsEcReT</property>
    <property name="hibernate.hikari.dataSource.cachePrepStmts">true</property>
    <property name="hibernate.hikari.dataSource.prepStmtCacheSize">250</property>
    <property name="hibernate.hikari.dataSource.prepStmtCacheSqlLimit">2048</property>
    <property name="hibernate.hikari.dataSource.useServerPrepStmts">true</property>

    <mapping class="Database.Authentication.User"/>

</session-factory>

会话工厂

我使用这个 Hibernate Util 类来获取会话对象。

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

/**
 * Hibernate session management
 */
public class HibernateUtilUserAuthentication 
    private static SessionFactory sessionFactory;

    public static SessionFactory getSessionFactory() 
        if (sessionFactory == null) 
            // loads configuration and mappings
            Configuration configuration = new Configuration().configure("hibernate.userauthentication.cfg.xml");
            ServiceRegistry serviceRegistry
                    = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties()).build();

            // builds a session factory from the service registry
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        

        return sessionFactory;
    

错误

在源代码中发生第一次数据库访问时,会引发以下错误。 claspath 似乎有问题,但所有必需的库都在那里,我可以在 IntelliJ 中看到它们。

Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691)
    at Database.Authentication.HibernateUtilUserAuthentication.getSessionFactory(HibernateUtilUserAuthentication.java:104)
    at Database.Authentication.UserAPI.authenticateUser(UserAPI.java:133)
    at Database.Authentication.UserAuthentication.login(UserAuthentication.java:60)
    at Bean.LoginBean.login(LoginBean.java:94)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 32 more
Caused by: org.hibernate.HibernateException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    at com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:86)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
    ... 56 more
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    at com.zaxxer.hikari.util.UtilityElf.createInstance(UtilityElf.java:120)
    at com.zaxxer.hikari.pool.PoolUtilities.initializeDataSource(PoolUtilities.java:110)
    at com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:157)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:60)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:48)
    at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:80)
    at com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:82)
    ... 64 more
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1139)
    at com.zaxxer.hikari.util.UtilityElf.createInstance(UtilityElf.java:105)
    ... 70 more

但是图书馆在那里:

部署时复制到Tomcat中:

./webapps/Testapplication/WEB-INF/lib/mysql-connector-java-6.0.2.jar 

我不知道为什么找不到 JDBC MySQL 驱动程序。非常感谢任何帮助。 提前谢谢!

【问题讨论】:

【参考方案1】:

mysql-connector-java-6 中的包结构发生了变化。切换到mysql-connector-java-5.x

<!-- http://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>

【讨论】:

您好,我已经尝试恢复到以前版本的 MySQL 连接器,但我仍然收到相同的错误“Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.jdbc2.optional .MysqlDataSource" @MightyApe 更改后您也重新部署了您的应用程序? 是的,当然,我使用tomcat7-maven-plugin进行部署。 我必须添加一个更正。当我测试旧的 5.1.39 版本是否可以工作时,我没有更改所有模块中的版本。我当前的项目使用不同的单独模块,每个模块都有一个单独的 pom 文件。所以在不同的模块中仍然存在 MySQL 6.0.2 依赖项。将它们全部改回工作! MySQL 6.0.2 连接器的文档指出,这将是 Packe 的新路径,但此类不存在:com.mysql.cj.jdbc.jdbc2.optional.MysqlDataSource 是因为该版本仍在开发中?

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

如何在java里获取hibernate连接池最大连接数和当前连接数

使用 Spring boot 嵌入式 tomcat 连接池,无需 jdbctemplate、hibernate 或 JPA

Hibernate多库连接池

hibernate分页 tomcat卡死

DBCP,C3P0与Tomcat jdbc pool 连接池的比较

Tomcat 8、HikariCP、Hibernate 和 MySQL