gpt4 book ai didi

java - hibernate 连接问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:48:48 25 4
gpt4 key购买 nike

我正在开发一个 Web 应用程序,在 Hibernate 抛出异常后出现连接错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

每次我在发生异常后尝试访问我的数据库时,它都会给我这个异常。

现在,如果我的应用程序编码良好,那么 Hibernate 不应该抛出错误,但如果与数据库的连接发生问题,我不希望我的应用程序陷入此错误。

这是我的 HibernateUtil 类:

public class HibernateUtil {
private static Logger log = Logger.getLogger(HibernateUtil.class);
private static org.hibernate.SessionFactory sessionFactory;
private static String confFile = "hibernate-test.properties";
private static final ThreadLocal<Session> threadSession = new ThreadLocal<Session>();

private HibernateUtil() {

}

public static void buildSessionFactory(){
Configuration configuration = new Configuration();
synchronized(HibernateUtil.class){
if(sessionFactory == null){
try {
Properties properties = new Properties();
properties.load(HibernateUtil.class.getClassLoader().getResourceAsStream(confFile));
configuration.setProperties(properties);
} catch (Exception e) {
log.fatal("cannot load the specified hibernate properties file: " + confFile);
throw new RuntimeException("cannot load the specified hibernate properties file : " + confFile, e);
}
sessionFactory = configuration.configure().buildSessionFactory();
}

HibernatePBEEncryptorRegistry registry = HibernatePBEEncryptorRegistry.getInstance();

if(registry.getPBEStringEncryptor("strongHibernateStringEncryptor") == null) {
StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor();
strongEncryptor.setAlgorithm("PBEWithMD5AndDES"); // not really needed as it is the default
strongEncryptor.setPassword("aStrongPassword");
registry.registerPBEStringEncryptor("strongHibernateStringEncryptor", strongEncryptor);
}
}
}

public static SessionFactory getSessionFactory() {
if(sessionFactory == null){
buildSessionFactory();
}
return sessionFactory;
}

public static Session getCurrentSession(){
if(!getSessionFactory().getCurrentSession().isOpen())
getSessionFactory().openSession();
return getSessionFactory().getCurrentSession();
}
}

这是我的 BaseAction 类,其中设置了 session 的初始化和关闭:

public class BaseAction extends ActionSupport {

public Session hib_session;

public void initHibSession() {
hib_session = HibernateUtil.getCurrentSession();
hib_session.beginTransaction();
hib_session.clear();
}

public void closeHibSession() {
hib_session.getTransaction().commit();
}
}

这是一个操作示例:

Transaction transaction = new Transaction(user, Transaction.Type.REGISTRATION, new HashSet(domains));

initHibSession();
hib_session.save(transaction);
closeHibSession();
transaction_id = transaction.getId();

有没有办法避免上述异常?

最佳答案

It gave me this exception each time I try to access my db after an exception occurred.

我不确定具体情况。无论如何,发生异常后,您应该回滚事务,关闭 session 并重新开始。话虽这么说,我对你的代码有一些评论。

关于您的HibernateUtil:

  • 为什么你有一个ThreadLocalSession#getCurrentSession()方法会为你处理它(尽管你似乎没有使用线程本地)。

  • HibernateUtil.getCurrentSession()中,你为什么要搞乱getCurrentSession()openSession() ?首先,没有必要做你所做的事情,getCurrentSession()如果没有 session 与当前线程关联,将返回一个新的 session 。其次,这两种方法不同并且具有不同的语义(使用 openSession() 时需要自己关闭 session ),您应该使用其中之一。

关于您的BaseAction:

  • 我想知道你为什么 clear() Session#beginTransaction()之后的 session 。如果您没有提交正在进行的事务,您将丢失所有待处理的更改。这真的是你想要的吗?

PS:我会考虑使用Open Session in View模式来消除代码中的所有这些负担。

资源

关于java - hibernate 连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816385/

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