草庐IT

java - 在 Hibernate 5、Tomcat 8 中配置数据源

coder 2023-10-05 原文

需要一些说明和帮助。特别感谢描述一般概念或描述它们的链接。

因此,在 hibernate 网站上我阅读了下一篇:

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:

我有几个问题,因为目前我真的对 DataSource、DataDriver、Tomcat 和 Hibernate 的所有这些东西感到困惑。

  1. 是否配置数据源并将 SessionFactory 绑定(bind)到 JNDI 是同一个过程吗?
  2. 如果不是,我们使用 DataSource 的目的是什么以及为什么我们需要将 SessionFactory 绑定(bind)到 JNDI(一般情况下)?
  3. 我的理解对吗?如果我们在 hibernate.cfg.xml 文件中配置 DataSource 就不需要在 {tomcat}/conf/server.xml 或 {tomcat}/conf/context.xml 中配置它?
  4. 什么是hibernate.jndi.url?是否与 hibernate.connection.url 相同?
  5. 什么是hibernate.connection.datasource?在文档中我读到它是“数据源 JNDI 名称”,所以如果我理解正确的话它可以是任何名称?
  6. 我从 Hibernate 文档中读到设置至少一个属性 hibernate.connection.datasource, hibernate.jndi.url, hibernate.jndi.class, hibernate.connection.username, hibernate.connection.password 使我的应用程序使用在 JNDI 中注册的 javax.sql.Datasource。那么下一个conf是否已经配置为使用DataSource?
  7. 如何检查 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://stackoverflow.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>

提前谢谢大家。

最佳答案

在您发布的配置中,您正在初始化应用程序中的连接池。

另一种方法是将数据库池的创建委托(delegate)给您的应用程序/网络服务器,并将其作为 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>

关于java - 在 Hibernate 5、Tomcat 8 中配置数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274576/

有关java - 在 Hibernate 5、Tomcat 8 中配置数据源的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐