Problème avec hibernate+MySQL

Résolu/Fermé
sofien007 Messages postés 26 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 25 novembre 2008 - 15 août 2008 à 12:41
 khalil - 11 déc. 2008 à 23:00
Bonjour,

Mon problème c'est presque comme celui là mais j'utilise hibernate et un pool de connexion. J'ai le stacktrace suivant :

15 août 2008 12:28:05 org.hibernate.cfg.Environment <clinit>
INFO: Hibernate 3.2.4.sp1
15 août 2008 12:28:05 org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
15 août 2008 12:28:05 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : cglib
15 août 2008 12:28:05 org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
15 août 2008 12:28:05 org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
15 août 2008 12:28:05 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
15 août 2008 12:28:06 org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource : com/dao/FBEleve/Eleve.hbm.xml
15 août 2008 12:28:06 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: com.dao.FBEleve.Eleve -> fb_eleves
15 août 2008 12:28:06 org.hibernate.cfg.Configuration doConfigure
INFO: Configured SessionFactory: null
15 août 2008 12:28:06 org.hibernate.connection.C3P0ConnectionProvider configure
INFO: C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://172.16.0.43:3306/test"
15 août 2008 12:28:06 org.hibernate.connection.C3P0ConnectionProvider configure
INFO: Connection properties: {user=sofien, password=****}
15 août 2008 12:28:06 org.hibernate.connection.C3P0ConnectionProvider configure
INFO: autocommit mode: false
15 août 2008 12:28:07 com.mchange.v2.log.MLog <clinit>
INFO: MLog clients using java 1.4+ standard logging.
15 août 2008 12:28:07 com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.0 [built 11-July-2005 00:43:29 -0400; debug? true; trace: 10]
15 août 2008 12:28:07 com.mchange.v2.c3p0.PoolBackedDataSource getPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@13c1b02 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@1507fb2 [ acquireIncrement -> 5, acquireRetryAttempts -> 100, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1507fb2, idleConnectionTestPeriod -> 1000, initialPoolSize -> 5, maxIdleTime -> 300, maxPoolSize -> 20, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@edc3a2 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> edc3a2, jdbcUrl -> jdbc:mysql://172.16.0.43:3306/test", properties -> {user=******, password=******} ], preferredTestQuery -> null, propertyCycle -> 300, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, usesTraditionalReflectiveProxies -> false ], factoryClassLocation -> null, identityToken -> 13c1b02, numHelperThreads -> 3 ]
15 août 2008 12:29:47 com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask run
ATTENTION: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@ec4a87 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (100).
15 août 2008 12:29:47 com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask run
ATTENTION: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1d64c37 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (100).
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
ATTENTION: Could not obtain connection metadata
java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:104)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:236)
at com.mchange.v2.c3p0.PoolBackedDataSource.getConnection(PoolBackedDataSource.java:94)
at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:56)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
at persistence.HibernateUtil.<clinit>(HibernateUtil.java:15)
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAcquire(BasicResourcePool.java:970)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:208)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:232)
... 6 more
15 août 2008 12:29:47 org.hibernate.dialect.Dialect <init>
INFO: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
15 août 2008 12:29:47 org.hibernate.transaction.TransactionFactoryFactory buildTransactionFactory
INFO: Using default transaction strategy (direct JDBC transactions)
15 août 2008 12:29:47 org.hibernate.transaction.TransactionManagerLookupFactory getTransactionManagerLookup
INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Automatic flush during beforeCompletion(): disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Automatic session close at end of transaction: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Scrollable result sets: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: JDBC3 getGeneratedKeys(): disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Connection release mode: auto
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Maximum outer join fetch depth: 2
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Default batch fetch size: 1
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Generate SQL with comments: enabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Order SQL updates by primary key: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Order SQL inserts for batching: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory createQueryTranslatorFactory
INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
15 août 2008 12:29:47 org.hibernate.hql.ast.ASTQueryTranslatorFactory <init>
INFO: Using ASTQueryTranslatorFactory
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Query language substitutions: {}
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: JPA-QL strict compliance: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Second-level cache: enabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Query cache: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory createCacheProvider
INFO: Cache provider: org.hibernate.cache.NoCacheProvider
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Optimize cache for minimal puts: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Structured second-level cache entries: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Statistics: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Deleted entity synthetic identifier rollback: disabled
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Default entity-mode: pojo
15 août 2008 12:29:47 org.hibernate.cfg.SettingsFactory buildSettings
INFO: Named query checking : enabled
15 août 2008 12:29:48 org.hibernate.impl.SessionFactoryImpl <init>
INFO: building session factory
15 août 2008 12:29:48 org.hibernate.impl.SessionFactoryObjectFactory addInstance
INFO: Not binding factory to JNDI, no JNDI name configured
15 août 2008 12:29:53 org.hibernate.impl.SessionFactoryImpl close
INFO: closing

Comme le montre le text en gras, je ne peux pas avoir de connexion à la base de données.

voici mon fichier hibernate.cfg.xml :

<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<!-- JDBC connection to Oracle
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1522:test</property>
<property name="hibernate.connection.username">test</property>
<property name="hibernate.connection.password">test</property>-->

<!-- JDBC connection to MySQL -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://172.16.0.43:3306/test"</property>
<property name="hibernate.connection.username">sofien</property>
<property name="hibernate.connection.password">mysql</property>

<!-- Common parameters -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">1000</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.c3p0.acquireRetryAttempts">60</property>

<!-- SQL to stdout logging -->
<property name="show_sql">false</property>
<property name="format_sql">false</property>
<property name="use_sql_comments">true</property>
<!-- <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

<!-- <mapping resource="hello/Message.hbm.xml"/>-->
<!-- <mapping resource="com/dao/eleve/Eleve.hbm.xml"/>-->
<mapping resource="com/dao/FBEleve/Eleve.hbm.xml"/>
<!-- <mapping resource="com/dao/eleve/Eleve_s.hbm.xml"/>-->
</session-factory>
</hibernate-configuration>

Merci de m'aider !

4 réponses

hafidodido Messages postés 40 Date d'inscription vendredi 15 août 2008 Statut Membre Dernière intervention 11 octobre 2008 10
Modifié par 00lina00 le 24/07/2010 à 00:33
slt sofien007
je vais vous détailler la démarche de travail avec hibernate

Hibernate a besoin de plusieurs éléments pour fonctionner :

* une classe de type javabean qui encapsule les données d'une occurence d'une table
* un fichier de correspondance qui configure la correspondance entre la classe et la table
* des propriétés de configuration notamment des informations concernant la connexion à la base de données

Une fois ces éléments correctement définis, il est possible d'utiliser Hibernate dans le code des traitements à réaliser.

Donc les étapes sont les suivantes:
1. La création d'une classe qui va encapsuler les données(javabean)
2. La création d'un fichier de correspondance ou de mapping
Pour assurer le mapping, Hibernate a besoin d'un fichier de correspondance (mapping file) au format XML qui va contenir des informations sur la correspondance entre la classe définie et la table de la base de données.

Même si cela est possible, il n'est pas recommandé de définir un fichier de mapping pour plusieurs classes. Le plus simple est de définir un fichier de mapping par classe, nommé du nom de la classe suivi par ".hbm.xml". Ce fichier doit être situé dans le même répertoire que la classe correspondante ou dans la même archive pour les applications packagées.

Différents éléments sont précisés dans ce document XML :

* la classe qui va encapsuler les données
* l'identifiant dans la base de données et son mode de génération
* le mapping entre les propriétés de classe et les champs de la base de données
* les relations
* ...
pour moi j'ai utilisé un fichier de mapping par table(Factures.hbm.xml---->la table factures) pour bien séparer les choses.
exemple d'un fichier de mapping que j'ai déja utilisé: "Factures.hbm.xml"
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Factures" table="Factures">
<id name="NumAvisIncident" type="int" column="NumAvisIncident">
<generator class="assigned"/>
</id>
<property name="NumFacture" type="int" not-null="true" />
<property name="ConsommationEstime" type="string" not-null="true" />
<property name="CodeTarif" type="int" not-null="true" />
<property name="PrixUnitaire" type="string" not-null="true" />
<property name="Timbre" type="string" not-null="true" />
<property name="GenrePaie" type="string" not-null="false" />
<property name="MontantPaye" type="string" not-null="false"/>
<property name="MontantConsommation" type="string" not-null="true" />
<property name="NetPayer" type="string" not-null="true" />
<property name="DontTva" type="string" not-null="true">

</property>
</class>
</hibernate-mapping>


3. La création d'un fichier de correspondance ou bien pour la configuration

Pour exécuter Hibernate, il faut lui fournir un certain nombre de propriétés concernant sa configuration pour qu'il puisse se connecter à la base de données.

Ces propriétés peuvent être fournies sous plusieurs formes :

* un fichier de configuration nommé hibernate.properties et stocké dans un répertoire inclus dans le classpath
* un fichier de configuration au format XML nommé hibernate.cfg.xml
* utiliser la méthode setProperties() de la classe Configuration
* définir des propriétés dans la JVM en utilisant l'option -Dpropriété=valeur

exemple d'un fichier de configuration que j'ai déja utilisé:ce fichier est nommé "hibernate.cfg.xml"
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>

<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/nomdemabasededonnée</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<property name="connection.pool_size">1</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>


<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="Factures.hbm.xml"/>
<mapping resource="Labo.hbm.xml"/>
<mapping resource="Tarifs.hbm.xml"/>
<mapping resource="Communes.hbm.xml"/>
<mapping resource="Users.hbm.xml"/>

</session-factory>
</hibernate-configuration>

4. L'utilisation d'Hibernate

Pour utiliser Hibernate dans le code, il est nécessaire de réaliser plusieurs opérations :

* création d'une instance de la classe
* création d'une instance de la classe SessionFactory
* création d'une instance de la classe Session qui va permettre d'utiliser les services d'Hibernate
Si les propriétés sont définies dans le fichier hibernate.properties, il faut tout d'abord créer une instance de la classe Configuration. Pour lui associer la ou les classes encapsulant les données, la classe propose deux méthodes :

* addFile() qui attend en paramètre le nom du fichier de mapping
* addClass() qui attend en paramètre un objet de type Class encapsulant la classe. Dans ce cas, la méthode va rechercher un fichier nommé nom_de_la_classe.hbm.xml dans le classpath (ce fichier doit se situe dans le même répertoire que le fichier .class de la classe correspondante)

Une instance de la classe Session est obtenu à partir d'une fabrique de type SessionFactory. Cet objet est obtenu à partir de l'instance du type Configuration en utilisant la méthode buildSessionFactory().

La méthode openSession() de la classe SessionFactory permet d'obtenir une instance de la classe Session.

Par défaut, la méthode openSession() qui va ouvrir une connexion vers la base de données en utilisant les informations fournies par les propriétés de configuration.
Exemple :

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.Configuration;
import java.util.Date;

public class TestHibernate1 {

public static void main(String args[]) throws Exception {
Configuration config = new Configuration();
config.addClass(Personnes.class);
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
...

Il est aussi possible de fournir en paramètre de la méthode openSession() une instance de la classe javax.sql.Connection qui encapsule la connexion à la base de données.

Pour une utilisation du fichier hibernate.cfg.xml, il faut créer une occurrence de la classe Configuration, appeler sa méthode configure() qui va lire le fichier XML et appeler la méthode buildSessionFactory() de l'objet renvoyer par la méthode configure().
Exemple :

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.Configuration;
import java.util.*;

public class TestHibernate1 {
public static void main(String args[]) throws Exception {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
...


Il est important de clôturer l'objet Session, une fois que celui est devenu inutile, en utilisant la méthode close().

5.Exemple d'utilisation de hibernate dans le code "La persistance d'une nouvelle occurence"

Pour créer une nouvelle occurrence dans la source de données, il suffit de créer une nouvelle instance de classe encapsulant les données, de valoriser ces propriétés et d'appeler la méthode save() de la session en lui passant en paramètre l'objet encapsulant les données.

La méthode save() n'a aucune action directe sur la base de données. Pour enregistrer les données dans la base, il faut réaliser un commit sur la connexion ou la transaction ou faire appel à la méthode flush() de la classe Session.
Exemple :

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.Configuration;
import java.util.Date;

public class TestHibernate1 {

public static void main(String args[]) throws Exception {
Configuration config = new Configuration();
config.addClass(Personnes.class);
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();

Transaction tx = null;
try {
tx = session.beginTransaction();
Personnes personne = new Personnes("nom3", "prenom3", new Date());
session.save(personne);
session.flush() ;
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
throw e;
} finally {
session.close();
}

sessionFactory.close();
}
}




je souhaite que ça vous aide et bonne chance.
15
hafidodido Messages postés 40 Date d'inscription vendredi 15 août 2008 Statut Membre Dernière intervention 11 octobre 2008 10
Modifié par 00lina00 le 24/07/2010 à 00:33
slt
vous pouvez expliquer sur quelle étape vous avez des problemes.
1
sofien007 Messages postés 26 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 25 novembre 2008
16 août 2008 à 10:30
Bonjour, mon problème est dans java.sql.SQLException: Connections could not be acquired from the underlying database! qui engendra les exceptions suivantes...
Comment résoudre ca :(?
0
Bonjour Abdelhafid,

nous utilisons jotm et jndi afin de gérer les pools de connexions hors objectweb a arrété de develloper leur produit depuis 2003. Par le fait meme nous nous sommes tournés vers atomikos cependant nous avions rencontré des problémes par exemple nous faisions un select à l'aide d'atomikos or celui-ci ne retournait 0 ligne malgre qu'il existait des enregistrements pour ce select.

Est ce que vous pourriez nous suggerer des outils qui peuvent remplacer jndi et jotm toujours dans lle open source.

Merci pour votre reponse

Khalil
0