gpt4 book ai didi

java - get 在没有 Activity 事务的情况下无效 - hibernate 5

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:40 24 4
gpt4 key购买 nike

即使我已手动启动交易,我仍不断收到此错误。

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.getTransaction();
if(!transaction.isActive())
{
transaction = session.beginTransaction();
}

accessToken = session.get(OAuthAccessToken.class, token);

hibernate.cfg.xml

<property name="hibernate.connection.autoReconnect">true</property>

<!-- Use the C3P0 connection pool. -->
<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">3000</property>

<!-- Disable second-level cache. -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="cache.use_query_cache">false</property>
<property name="cache.use_minimal_puts">false</property>
<property name="max_fetch_depth">3</property>

<!-- Bind the getCurrentSession() method to the thread. -->
<property name="current_session_context_class">thread</property>

<property name="hibernate.jdbc.batch_size">30</property>

hibernate 工具

public class HibernateUtil
{
private static final SessionFactory sessionFactory;

static
{
try
{
// Create the SessionFactory from hibernate.cfg.xml
Configuration config = new Configuration().configure();
config.setProperty("hibernate.show_sql", String.valueOf(ConfigManager.getInstance().getBoolean(Consts.CONFIG_DB_SHOW_SQL, false)));
config.setProperty("hibernate.format_sql", String.valueOf(ConfigManager.getInstance().getBoolean(Consts.CONFIG_DB_FORMAT_SQL, false)));

config.setProperty("hibernate.dialect", ConfigManager.getInstance().getString(Consts.CONFIG_DB_DIALECT, "org.hibernate.dialect.MySQLDialect"));
config.setProperty("hibernate.connection.driver_class", ConfigManager.getInstance().getString(Consts.CONFIG_DB_DRIVER_CLASS, "com.mysql.jdbc.Driver"));
config.setProperty("hibernate.connection.url", ConfigManager.getInstance().getString(Consts.CONFIG_DB_URL, "jdbc:mysql://localhost/photometo"));
config.setProperty("hibernate.connection.useUnicode", "true");
config.setProperty("hibernate.connection.characterEncoding", "UTF-8");
config.setProperty("hibernate.connection.username", ConfigManager.getInstance().getString(Consts.CONFIG_DB_USERNAME, "root"));
config.setProperty("hibernate.connection.password", ConfigManager.getInstance().getString(Consts.CONFIG_DB_PASSWORD, ""));
config.setProperty("hibernate.hbm2ddl.auto", ConfigManager.getInstance().getString(Consts.CONFIG_DB_HBMDDL_AUTO, "update"));
sessionFactory = config.buildSessionFactory();
}
catch (Throwable ex)
{
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory()
{
return sessionFactory;
}

}

我注意到这会在一段时间后开始发生。如果我重新启动 tomcat 或重新部署应用程序,问题就会消失

最佳答案

你从来没有开始过一个Transaction,你也无法得到other的一个transaction。这就是为什么您在调用它时遇到错误的原因:

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.getTransaction(); // Here is the error! You can't get an active transaction, becasue there isn't even started
if(!transaction.isActive()) // transaction.isActive() is usually for closing a transction in the end
{
transaction = session.beginTransaction(); // You are starting the transaction!
}

accessToken = session.get(OAuthAccessToken.class, token);

您无法获取 Activity 事务,因为还没有开始。将代码更改为:

 // Non-managed environment idiom with getCurrentSession()
try {
factory.getCurrentSession().beginTransaction();

// do some work
...

factory.getCurrentSession().getTransaction().commit();
}
catch (RuntimeException e) {
factory.getCurrentSession().getTransaction().rollback();
throw e; // or display error message
}

在非托管环境中启动事务的正确原因来自 Documentation of Hibernate :

// Non-managed environment idiom with getCurrentSession()
try {
factory.getCurrentSession().beginTransaction();

// do some work
...

factory.getCurrentSession().getTransaction().commit();
}
catch (RuntimeException e) {
factory.getCurrentSession().getTransaction().rollback();
throw e; // or display error message
}

// Non-managed environment idiom with getCurrentSession() try {
factory.getCurrentSession().beginTransaction();

// do some work
...

factory.getCurrentSession().getTransaction().commit(); } catch (RuntimeException e) {
factory.getCurrentSession().getTransaction().rollback();
throw e; // or display error message }

遵循 getTransaction() 的文档,您的当前 session 未启动事务。

getTransaction()
Get the Transaction instance associated with this session.

这就是开始交易的原因11.2 Database Transaction demarcation :

Database, or system, transaction boundaries are always necessary. No communication with the database can occur outside of a database transaction (this seems to confuse many developers who are used to the auto-commit mode). Always use clear transaction boundaries, even for read-only operations.

长时间事务对数据库不利,因为在您的数据库中生成了很多锁,Session and transaction scopes

In order to reduce lock contention in the database, a database transaction has to be as short as possible. Long database transactions will prevent your application from scaling to a highly concurrent load. It is not recommended that you hold a database transaction open during user think time until the unit of work is complete.

关于java - get 在没有 Activity 事务的情况下无效 - hibernate 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41869684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com