gpt4 book ai didi

java - Hibernate:c3p0 在 NewProxyConnection.commit() 处抛出 NullPointerException

转载 作者:行者123 更新时间:2023-11-29 13:12:31 25 4
gpt4 key购买 nike

我在版本 4.3.1.Final 中同时使用 Hibernate 和 C3P0。 MySQL 5.6.14(所有表的 InnoDB)。

hibernate.cfg.xml 中的 C3P0 设置为:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1</property>
<property name="hibernate.c3p0.minPoolSize">3</property>
<property name="hibernate.c3p0.maxPoolSize">100</property>

例如,当我提交事务时:

public void editCategory(int id, String title) {
Transaction tx = getTransaction();
Query q = session.createQuery("FROM Category WHERE id = :id");
q.setInteger("id", id);
Category cat = (Category) q.uniqueResult();
cat.setTitle(title);
tx.commit();
}
private Transaction getTransaction() {
Transaction tx = session.getTransaction();
if (!tx.isActive()) {
tx.begin();
}
return tx;
}

在 5 次尝试中,大约有 3 次提交失败,原因是:

SEVERE: Servlet.service() for servlet [appserver.services.ApplicationConfig] in context with path [/AppServer] threw exception [org.hibernate.TransactionException: commit failed] with root cause
java.lang.NullPointerException
at com.mchange.v2.c3p0.impl.NewProxyConnection.commit(NewProxyConnection.java:1284)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:112)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:180)
at appserver.dao.CategoryDao.createCategory(CategoryDao.java:60)
at appserver.services.CategoryResource.createCategory(CategoryResource.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:402)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:349)
... stacktrace continues

我是否缺少 C3P0 设置的某些内容?感谢帮助!

最佳答案

您的应用服务器正在报告根本原因的根本原因,即它正在跳过一个异常,该异常本来会报告更多信息性消息,“您无法在关闭的连接上进行操作!!!”

您的应用程序中存在竞争条件。您摘录的方法中引用的对象“ session ”有时很可能在查询和提交之间进行 close()ed。 (hibernate Session 包装了 JDBC Connection。)

您需要了解 session 的生命周期,并确保这种情况永远不会发生。最简单的是,您可能根本避免缓存 session 。您可以在需要时获取它们,并在使用后立即关闭它们,即在您提交()交易之后(可靠地,通过finally block 或try-with-resources构造)。

关于java - Hibernate:c3p0 在 NewProxyConnection.commit() 处抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21884701/

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