Java 休眠连接问题
我正在使用webapp,在Hibernate引发异常后出现连接错误:Java 休眠连接问题,java,hibernate,Java,Hibernate,我正在使用webapp,在Hibernate引发异常后出现连接错误: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 每次我在异常发生后尝试访问数据库时,它都会给我这个异常 现在,如果我的应用程序编码良好,Hibernate不应该抛出错误,但是如果与db的连接出现问题,我不希望我的应用程序陷入这个错误 这是我的
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
每次我在异常发生后尝试访问数据库时,它都会给我这个异常
现在,如果我的应用程序编码良好,Hibernate不应该抛出错误,但是如果与db的连接出现问题,我不希望我的应用程序陷入这个错误
这是我的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();
}
}
下面是一个操作示例:
Transaction transaction = new Transaction(user, Transaction.Type.REGISTRATION, new HashSet(domains));
initHibSession();
hib_session.save(transaction);
closeHibSession();
transaction_id = transaction.getId();
有没有办法避免上述例外情况
每次我在异常发生后尝试访问数据库时,它都会给我这个异常
我不知道确切的情况。无论如何,在发生异常后,您应该回滚事务,关闭会话并重新开始。话虽如此,我对你的代码有一些看法
关于您的HibernateUtil
:
- 为什么您有一个
,ThreadLocal
方法为您处理这个问题(不过您似乎没有使用ThreadLocal)Session\getCurrentSession()
- 在
中,为什么要处理和?首先,不需要执行您所做的操作,如果当前线程未关联任何会话,则将返回一个新的会话。其次,这两种方法不同,语义也不同(使用时需要自己关闭HibernateUtil.getCurrentSession()
),您应该使用其中一种会话
基本操作
:
- 我想知道你为什么在会后缺席。如果您没有提交正在进行的事务,您将丢失所有挂起的更改。这真的是你想要的吗
PS:我会考虑使用这个模式来消除代码中的所有负担。
资源HibernateUtil
:
- 为什么您有一个
,ThreadLocal
方法为您处理这个问题(不过您似乎没有使用ThreadLocal)Session\getCurrentSession()
- 在
中,为什么要处理和?首先,不需要执行您所做的操作,如果当前线程未关联任何会话,则将返回一个新的会话。其次,这两种方法不同,语义也不同(使用时需要自己关闭HibernateUtil.getCurrentSession()
),您应该使用其中一种会话
基本操作
:
- 我想知道你为什么在会后缺席。如果您没有提交正在进行的事务,您将丢失所有挂起的更改。这真的是你想要的吗
PS:我会考虑使用这个模式来消除代码中的所有负担。
资源Transaction transaction = new Transaction(user, Transaction.Type.REGISTRATION, new HashSet(domains));
initHibSession();
hib_session.save(transaction);
closeHibSession();
transaction_id = transaction.getId();