2017-09-04 1 views
0

Voici ma configuration de base de données pour se connecter à db en utilisant Mise en veille prolongée:connexion de base de données avec mise en veille prolongée ne met pas à jour

public class HibernateUtil { 
public static HibernateUtil mInstance = null; 

public static HibernateUtil getInstance(DBMode dbMode) { 
    if (mInstance == null) { 
     mInstance = new HibernateUtil(dbMode); 
    } 
    return mInstance; 
} 

private SessionFactory sessionFactory; 

private HibernateUtil(DBMode dbMode) { 
     buildSessionFactoryTest(); 
     } 

private void buildSessionFactoryTest() { 
    Configuration configuration = new Configuration() 
      .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect") 
      .setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver") 
      .setProperty("hibernate.connection.url", 
        "jdbc:mysql://ip:port/DB?createDatabaseIfNotExist=true&autoReconnect=true&useUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf8&characterEncoding=utf-8") 
      .setProperty("hibernate.connection.username", "root") 
      .setProperty("hibernate.connection.password", "password") 
      .setProperty("hibernate.hbm2ddl.auto", "update").setProperty("c3p0.max_size", "20") 
      .setProperty("c3p0.timeout", "1800").setProperty("3p0.min_size", "5") 
      .setProperty("hibernate.c3p0.max_statements", "0") 
      .setProperty("connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider") 
      .configure(); 
    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()) 
      .buildServiceRegistry(); 
    sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
} 

public Session getSession() { 
    Session session; 
    try { 
     session = sessionFactory.getCurrentSession(); 
    } catch (HibernateException e) { 
     session = sessionFactory.openSession(); 
    } 
    if (session == null || sessionFactory.isClosed() || !session.isConnected() || !session.isOpen()) { 
     sessionFactory.close(); 
      buildSessionFactoryTest(); 
     session = sessionFactory.openSession(); 
    } 
    return session; 
} 

}

et voici comment je me session du HibernateUtil:

Session session = HibernateUtil.getInstance(dbMode).getSession(); 

Mon application fonctionne correctement la plupart du temps, mais parfois lorsque j'ajoute un objet à la base de données et que j'exécute une requête, le nouvel objet ajouté ne retourne pas. Je suppose que la connexion a été mise en cache retourner les anciens résultats. Est-ce que mes configurations ont un problème?

+0

Certaines API telles que Session.get (Class, int) iront toujours à la base de données (au lieu de récupérer les données mises en cache). Je suggère que vous lisiez un tutoriel Hibernate. –

+0

@dsp_user Je suppose que se rendre à la base de données pour une nouvelle connexion par requête est coûteux en temps de complexité, Comme ma première connexion à DB après le déploiement s'exécute toujours lente. – Narges

+0

Je ne parle pas de créer une nouvelle connexion db pour chaque opération de base de données. Vous devriez, bien sûr, réutiliser votre connexion db. Je dis juste que certaines API Hibernate iront toujours dans la base de données et récupéreront donc les données/mises à jour les plus récentes. –

Répondre

0

Je pourrais être que vous utilisez des transactions et les réutilisent. Si c'est le cas, vous devriez commencer une nouvelle transaction pour chaque chose que vous faites.

par exemple: https://stackoverflow.com/a/24197494/3959856

Vous pouvez également utiliser

session.flush(); 
session.commit(); 

après l'ajout et la suppression.

+0

J'utilise une transaction uniquement lorsque je mets à jour une base de données, mais pour exécuter une requête 'select', je ne lance pas de transaction. – Narges

+0

non mais après l'ajout. commettez-vous? –

+0

Oui, je valide et vide la session après tous les changements – Narges