Data Source Configuration in Hibernate 5, Tomcat 8

Need to clarify and help. It is especially recommended to describe general concepts or the link where they are described.

So, on the sleep mode website, I read the following:

For use inside an application server, you should almost always configure Hibernate to receive connections from the application server. Javax.sql.Datasource is registered in JNDI. You will need to set at least one of the following properties:

And I have a few questions, because right now I'm really confused about all these things with DataSource, DataDriver, Tomcat and Hibernate in general.

  • Does the data source configure and bind the SessionFactory to the JNDI is the same process?
  • If not, why do we use a DataSource and why do we need to associate a SessionFactory with a JNDI (in general)?
  • Did I understand correctly? If we configure the DataSource in the hibernate.cfg.xml file, do we need to configure it in {tomcat} /conf/server.xml or {tomcat} /conf/context.xml?
  • What is hibernate.jndi.url? Is it the same as hibernate.connection.url?
  • What is hibernate.connection.datasource? I read in the docs that this is the “JNDI data source name”, so if I understood correctly, could it be any name?
  • I read from Hibernate docs that setting at least one of the properties hibernate.connection.datasource, hibernate.jndi.url, hibernate.jndi.class, hibernate.connection.username, hibernate.connection.passwordmakes my application use javax.sql.Datasourceregistered in JNDI. So, is the following conf already configured to use a DataSource?
  • How to check what is DataSourceused and configured normally?

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 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>

.

+4
1

.

/- 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>
+2

Source: https://habr.com/ru/post/1653328/


All Articles