【问题标题】:database connection with hibernate doesn't update与休眠的数据库连接不更新
【发布时间】:2017-09-04 11:51:47
【问题描述】:

这是我使用休眠连接到数据库的数据库配置:

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

}

这是我从 HibernateUtil 获取会话的方式:

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

我的应用程序在大多数情况下都能正常工作,但有时当我将一个对象添加到数据库并执行查询时,新添加的对象不会返回。我猜连接已被缓存返回旧结果。我的配置有问题吗?

【问题讨论】:

  • 某些 API,如 Session.get(Class, int) 将始终进入数据库(而不是获取缓存数据)。我建议你阅读一些 Hibernate 教程。
  • @dsp_user 我想每个请求都去数据库进行新连接的时间复杂度很高,因为我在部署后第一次连接数据库总是很慢。
  • 我不是在谈论为每个数据库操作创建一个新的数据库连接。当然,您应该重用您的数据库连接。我只是说一些 Hibernate API 将始终进入数据库,从而获取最新的数据/更新。
  • @dsp_user 我希望默认情况下会更新所有会话,感谢您的评论。我读过他们。
  • 向我们展示从数据库中检索数据的代码不起作用,我们或许可以提供更多帮助。

标签: java hibernate session connection


【解决方案1】:

我可能是您正在使用事务并且正在重用它们。如果是这种情况,你应该为你所做的每一件事开始一个新的事务。

例如:https://stackoverflow.com/a/24197494/3959856

您可能还想使用

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

添加和删除之后。

【讨论】:

  • 我只在更新数据库时使用事务,但在执行“选择”查询时我不启动事务。
  • 是的,我在所有更改后提交并刷新会话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多