Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Datasource configuring in Hibernate 5, Tomcat 8

Need some clarification and helps. Especially appreciate describing general concepts or link where they are described.

So, on the hibernate website I have read the next one:

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:

And I have a few question because at the moment I am really confused about all of that stuff with DataSource, DataDriver, Tomcat and Hibernate in general.

  1. Does configuring Datasource and binding SessionFactory to the JNDI is the same process?
  2. If no, for what we use DataSource and for why we need to bind SessionFactory to JNDI (in general)?
  3. Am I understood right? If we configure DataSource in hibernate.cfg.xml file we don't need to configure it in {tomcat}/conf/server.xml or {tomcat}/conf/context.xml?
  4. What is hibernate.jndi.url? Does it is the same as hibernate.connection.url?
  5. What is hibernate.connection.datasource? In docs I read that it is "datasource JNDI name", so if I understood right it can be any name?
  6. From Hibernate docs I read that setting at least one of the properties hibernate.connection.datasource, hibernate.jndi.url, hibernate.jndi.class, hibernate.connection.username, hibernate.connection.password makes my app use javax.sql.Datasource registered in JNDI. So does the next conf already configured to use DataSource?
  7. How to check that DataSource used and configured fine?

My hibernate.cfg.xml file:

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

Thank's everyone in advance.

like image 520
Nickolas Avatar asked Oct 19 '22 02:10

Nickolas


1 Answers

In the config you have posted you are initializing the connection pool within your application.

An alternative is to delegate the creation of the database pool to your app/web server and expose it as a JNDI resource. Your application need then only specify the name of the JNDI datasource to obtain a connection.

Doing this in Tomcat is documented here:

https://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

Your hibernate.cfg.xml then looks like:

<?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>
like image 97
Alan Hay Avatar answered Oct 21 '22 01:10

Alan Hay