2017-09-04 2 views
0

Hier meine Datenbank-Konfiguration ist Hibernate zu verbinden db mit:Datenbankverbindung mit Hibernate nicht aktualisiert

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

}

und hier ist, wie ich Sitzung von HibernateUtil erhalten:

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

Meine App funktioniert meistens korrekt, aber manchmal, wenn ich ein Objekt zur Datenbank hinzufüge und eine Abfrage ausführe, kommt das neue hinzugefügte Objekt nicht zurück. Ich denke, die Verbindung wurde zwischengespeichert, um alte Ergebnisse zurückzugeben. Haben meine Konfigurationen Probleme?

+0

Einige APIs wie Session.get (Class, int) gehen immer zur Datenbank (anstatt zwischengespeicherte Daten zu holen). Ich schlage vor, dass Sie ein Hibernate-Tutorial lesen. –

+0

@dsp_user Ich denke, die Datenbank für neue Verbindung pro Anfrage ist teuer in der Zeit Komplexität, Wie meine erste Verbindung zu db nach der Bereitstellung läuft immer langsam. – Narges

+0

Ich spreche nicht über das Erstellen einer neuen Datenbankverbindung für jede Datenbankoperation. Sie sollten natürlich Ihre db-Verbindung wiederverwenden. Ich sage nur, dass einige Hibernate-APIs immer die Datenbank aufrufen und somit die neuesten Daten/Updates abrufen. –

Antwort

0

Ich könnte sein, dass Sie Transaktionen verwenden und sie wiederverwenden. Wenn dies der Fall ist, sollten Sie für jede Sache, die Sie tun, eine neue Transaktion starten.

zum Beispiel: https://stackoverflow.com/a/24197494/3959856

Sie könnten auch

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

nach dem Hinzufügen und Löschen verwenden möchten.

+0

Ich verwende die Transaktion nur, wenn ich die Datenbank aktualisiere, aber zur Ausführung einer 'Select'-Abfrage starte ich keine Transaktionen. – Narges

+0

nein, aber nach dem Hinzufügen. verpflichtest du dich? –

+0

Ja, ich bestätige und spüle die Sitzung nach allen Änderungen – Narges

Verwandte Themen