在 Hibernate 5、Tomcat 8 中配置数据源
Posted
技术标签:
【中文标题】在 Hibernate 5、Tomcat 8 中配置数据源【英文标题】:Datasource configuring in Hibernate 5, Tomcat 8 【发布时间】:2017-01-09 12:25:45 【问题描述】:需要一些澄清和帮助。特别感谢描述一般概念或描述它们的链接。
所以,在hibernate网站上我已经阅读了下一篇:
对于在应用程序服务器中使用,您几乎总是应该 配置 Hibernate 以从应用服务器获取连接 在 JNDI 中注册的 javax.sql.Datasource。您至少需要设置 以下属性之一:
我有几个问题,因为目前我对 DataSource、DataDriver、Tomcat 和 Hibernate 的所有内容感到非常困惑。
-
是否配置数据源并将 SessionFactory 绑定到 JNDI
是同一个过程吗?
如果不是,我们使用什么 DataSource 以及为什么我们需要将 SessionFactory 绑定到 JNDI(通常)?
我理解对了吗?如果我们在 hibernate.cfg.xml 文件中配置 DataSource 我们不需要在 tomcat/conf/server.xml 或 tomcat/conf/context.xml 中配置它?
什么是
hibernate.jndi.url
?和hibernate.connection.url一样吗?
什么是hibernate.connection.datasource
?在文档中我读到它是“数据源 JNDI 名称”,所以如果我理解正确,它可以是任何名称?
从 Hibernate 文档中,我读到设置至少一个属性 hibernate.connection.datasource, hibernate.jndi.url, hibernate.jndi.class, hibernate.connection.username, hibernate.connection.password
会使我的应用程序使用在 JNDI 中注册的 javax.sql.Datasource
。那么下一个 conf 是否已经配置为使用 DataSource?
如何检查DataSource
的使用和配置是否正常?
我的 hibernate.cfg.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.generate_statistics">true</property>
<!--http://***.com/questions/2067526/hibernate-connection-pool-->
<property name="hibernate.dialect">org.hibernate.dialect.mysqlDialect</property>
<!--For use inside an application server, you should almost always configure Hibernate to obtain connections from an application server javax.sql.Datasource registered in JNDI. You will need to set at least one of the following properties:-->
<!--hibernate.connection.datasource,hibernate.jndi.url,hibernate.jndi.class,hibernate.connection.username,hibernate.connection.password-->
<!--Datasource config-->
<property name="hibernate.connection.datasource">jdbc:mysql://localhost/easywordweb</property>
<!--<property name="hibernate.jndi.url">??????? what is it</property>-->
<!--/Datasource config-->
<!--*****************************************************************-->
<!--C3P0 config-->
<!--Hibernate will obtain and pool connections using java.sql.DriverManager if you set the 5 following properties -->
<!--hibernate.connection.driver_class,hibernate.connection.url,hibernate.connection.username,hibernate.connection.password,hibernate.connection.pool_size-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/easywordweb</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.connection.password">password</property>
<!--We can use a third party pool for best performance and stability, for example c3p0. Just replace the hibernate.connection.pool_size property with connection pool specific settings. This will turn off Hibernate's internal pool. For example, you might like to use c3p0. -->
<!--<property name="hibernate.connection.pool_size">140</property>-->
<property name="hibernate.c3p0.max_size">140</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<!--max to cache-->
<property name="hibernate.c3p0.max_statements">50</property>
<!--The seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never expire. Hibernate default: 0-->
<property name="hibernate.c3p0.timeout">21600</property>
<!--for test, change futher-->
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1;</property>
<!--at every connection checkin to verify that the connection is valid-->
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<!--at every connection checkout to verify that the connection is valid-->
<property name="hibernate.c3p0.testConnectionOnCheckin">true</property>
<!--/for test, change futher-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--/C3P0 config-->
<!--*****************************************************************-->
<property name="hibernate.c3p0.validate">true</property>
<!--c3p0 will test all idle, pooled but unchecked-out connections, every this number of seconds-->
<property name="hibernate.c3p0.idle_test_period">21000</property>
<property name="hibernate.jdbc.batch_size">20</property>
<!--Number rows to be returned if no setted-->
<property name="hibernate.jdbc.fetch_size">20</property>
<property name="hibernate.jdbc.use_get_generated_keys">true</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<!--FIXING: Table "...".hibernate_sequence table not found.-->
<property name="hibernate.id.new_generator_mappings">false</property>
</session-factory>
</hibernate-configuration>
提前感谢大家。
【问题讨论】:
【参考方案1】:在您发布的配置中,您正在初始化应用程序中的连接池。
另一种方法是将数据库池的创建委托给您的应用程序/Web 服务器并将其公开为 JNDI 资源。然后,您的应用程序只需指定 JNDI 数据源的名称即可获得连接。
在 Tomcat 中执行此操作记录在此处:
https://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html
你的 hibernate.cfg.xml 然后看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.generate_statistics">true</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- The Server configured JNDI datasource -->
<property name="hibernate.connection.datasource">java:comp/env/jdbc/MyLocalDB</property>
<property name="hibernate.jdbc.batch_size">20</property>
<!--Number rows to be returned if no setted-->
<property name="hibernate.jdbc.fetch_size">20</property>
<property name="hibernate.jdbc.use_get_generated_keys">true</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<!--FIXING: Table "...".hibernate_sequence table not found.-->
<property name="hibernate.id.new_generator_mappings">false</property>
</session-factory>
</hibernate-configuration>
【讨论】:
嗨艾伦,感谢您的回答。我理解对了吗?就我而言,Hibernate 和 Tomcat 有绝对独立的连接池?Hibernate 只使用了自己的连接,而根本没有使用 Tomcat 连接? 您已经使用 c3po 库在您的应用程序内配置了一个连接池。 谢谢,我很抱歉)。一开始就误会你了。 很高兴能提供帮助。如果这回答了您的问题,您应该接受作为答案。以上是关于在 Hibernate 5、Tomcat 8 中配置数据源的主要内容,如果未能解决你的问题,请参考以下文章
Spring 4 with hibernate 5.2 Configuration(将hibernate 4移动到5.2):无法启动tomcat服务器
搭建springmvc4 spring4 hibernate4整合框架tomcat用啥版本
如何使用 Jax-RS(Jersey) 在 Tomcat7 上运行应用程序 Hibernate 5.x、Jpa 2.1、Java EE7(javaee-api 7.0)
配置hibernate 4通过tomcat 7中的JNDI Datasource连接数据库
Tapestry 5.3.8 + Jetty + Hibernate 4.3.5 + XAMPP 1.8.3 - IdClass 使用(派生)实体,为啥在尝试合并时它们会分离?