Hibernate中的操作超时 [英] Operations timeout in Hibernate

查看:301
本文介绍了Hibernate中的操作超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



这是我用来执行取决于用户选择的操作的主要类:

  package hibernate_tut_emp; 

import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class MyOps {

public static void main(String [] args){

Scanner scnr = new Scanner(System.in);
System.out.print(1 Insert \\\
2 Delete \\\
3 Update \\\
4 Select \\\
Enter a choice:);
int choice = scnr.nextInt();

SessionFactory sesfact = HibernateUtil.getSessionFactory();
会话会话= sesfact.openSession();
session.beginTransaction();

Employee emp = new Employee();


switch(choice){
case 1:// insert
System.out.print(Enter a name:);
String name = scnr.next();
System.out.print(Enter a surname:);
String surname = scnr.next();


emp.setName(name);
emp.setSurname(surname);

session.save(emp);
session.getTransaction()。commit();

break;
案例2://删除
System.out.print(输入要删除的名称:);

String delname = scnr.next();
Query delQuery = session.getNamedQuery(DeleteByName);
delQuery.setParameter(name,delname);
delQuery.executeUpdate();
session.getTransaction()。commit();

break;
案例3://更新
System.out.print(输入更新的名称:);
String upname = scnr.next();
System.out.print(输入姓氏以更新:);
String surn_name = scnr.next();


Query q = session.getNamedQuery(UpdateSurnameOfName);
q.setParameter(name,upname);
q.setParameter(surname,surn_name);
q.executeUpdate();
session.getTransaction()。commit();

break;
案例4:
System.out.print(输入名称以显示详细信息:);
String sh_name = scnr.next();

session = sesfact.getCurrentSession();
session.beginTransaction();

查询s_q = session.getNamedQuery(GetDetailsByName);
s_q.setParameter(name,sh_name);

列表列表= s_q.list();
Iterator it = list.iterator(); (it.hasNext()){
Employee employee =(Employee)it.next();

while(it.hasNext())
System.out.println(employee.getId()++ employee.getName()++ employee.getSurname());
}

break;
默认值:
System.out.println(错误的选择maadi ....);
休息;
}



}

}

HibernateUtil.java

  package hibernate_tut_emp; 

import org.hibernate.Session;
import org.hibernate.SessionFactory;
导入org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

private static ServiceRegistry serviceRegistry;

static {

try {

Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())。build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);

} catch(Throwable th){

System.err.println(Initial SessionFactory creation failed+ th);
抛出新的ExceptionInInitializerError(th);




public static SessionFactory getSessionFactory(){

return sessionFactory;



问题

直到现在,我单独执行了所有查询,它们都按预期工作,但在将所有查询放入 switch 我得到线程main中的异常org.hibernate.exception.LockTimeoutException:无法执行语句 error.I假设这与连接池有关。 />
是否有人可以告诉我在这里工作的方式以及在操作完成后释放连接(如果是建议的方式)?

控制台

  1插入
2删除
3更新
4选择
输入一个选项:1
Oct 03,2014 11:50:27 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager< clinit>
INFO:HCANN000001:Hibernate Commons Annotations {4.0.5.Final}
Oct 03,2014 11:50:27 AM org.hibernate.Version logVersion
INFO:HHH000412:Hibernate Core {4.3 .6.Final}
Oct 03,2014 11:50:27 AM org.hibernate.cfg.Environment< clinit>
INFO:HHH000206:找不到hibernate.properties
Oct 03,2014 11:50:27 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO:HHH000021:字节码提供程序名称:javassist
Oct 03,2014 11:50:27 AM org.hibernate.cfg.Configuration configure
INFO:HHH000043:从资源配置:/hibernate.cfg.xml
Oct 03,2014 11:50: 27 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO:HHH000040:配置资源:/hibernate.cfg.xml
Oct 03,2014 11:50:27 AM org.hibernate.internal.util.xml .DTDEntityResolver resolveEntity
WARN:HHH000223:识别过时的hibernate命名空间http://hibernate.sourceforge.net/。改为使用命名空间http://www.hibernate.org/dtd/。参考Hibernate 3.6迁移指南!
Oct 03,2014 11:50:27 AM org.hibernate.cfg.Configuration doConfigure
INFO:HHH000041:配置的SessionFactory:null
Oct 03,2014 11:50:27 AM org。 hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl配置
警告:HHH000402:使用Hibernate内置连接池(不适合生产使用!)
Oct 03,2014 11:50:27 AM org。 hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO:HHH000401:在URL [jdbc:mysql:// localhost:3306 / hibernate]使用驱动程序[com.mysql.jdbc.Driver]
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO:HHH000046:连接属性:{user = root,password = ****}
Oct 03,2014 11:50:27上午org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
信息:HHH000006:自动提交模式:false
Oct 03,2014 11:50:27 AM org.hibernate.engine.jdbc.con nections.internal.DriverManagerConnectionProviderImpl configure
INFO:HHH000115:Hibernate连接池大小:1(min = 1)
org.hibernate.dialect.Dialect< init>
INFO:HHH000400:使用方言:org.hibernate.dialect.MySQLDialect
org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399:使用默认事务策略(直接JDBC事务)
2014年10月3日上午11:50:28 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory< init>
INFO:HHH000397:使用ASTQueryTranslatorFactory
Oct 03,2014 11:50:28 AM org.hibernate.tool.hbm2ddl.SchemaUpdate执行
INFO:HHH000228:运行hbm2ddl模式更新
Oct 03,2014 11:50:28 AM org.hibernate.tool.hbm2ddl.SchemaUpdate执行
INFO:HHH000102:提取数据库元数据
Oct 03,2014 11:50:28 AM org.hibernate.tool .hbm2ddl.SchemaUpdate执行
INFO:HHH000396:更新模式
Oct 03,2014 11:50:28 AM org.hibernate.tool.hbm2ddl.TableMetadata< init>
INFO:HHH000261:找到表:hibernate.hib1
Oct 03,2014 11:50:28 AM org.hibernate.tool.hbm2ddl.TableMetadata< init>
INFO:HHH000037:列:[id,name,surname]
Oct 03,2014 11:50:28 AM org.hibernate.tool.hbm2ddl.TableMetadata< init>
INFO:HHH000108:外键:[]
Oct 03,2014 11:50:28 AM org.hibernate.tool.hbm2ddl.TableMetadata< init>
INFO:HHH000126:索引:[primary]
2014年10月3日上午11:50:28 org.hibernate.tool.hbm2ddl.SchemaUpdate执行
INFO:HHH000232:架构更新完成
输入名称:mohd。
输入姓氏:salim
Hibernate:插入hib1(姓名,ID)值(?,?,?)
Oct 03,2014 11:51:27 AM org.hibernate .engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN:SQL错误:1205,SQLState:41000
org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
错误:超出锁定等待超时;尝试重新启动事务
2014年10月3日上午11:51:27 org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO:HHH000010:在批量发布时,它仍包含JDBC语句
在线程main中的异常org.hibernate.exception.LockTimeoutException:无法执行语句
在org.hibernate.dialect.MySQLDialect $ 1.convert(MySQLDialect.java:447)
在org.hibernate .exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
在org.hibernate.engine .jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
在org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
在org.hibernate.engine .jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(Abs tractEntityPersister.java:3124)美元,org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581 B $ B)
在org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java: 104)
在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463)
在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349)$ b在org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
$ b在org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
。在组织.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
在org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
在org.hibernate.engine.transaction.internal .jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactio nImpl.commit(AbstractTransactionImpl.java:177)
at hibernate_tut_emp.MyOps.main(MyOps.java:38)
引起:java.sql.SQLException:超出锁定等待超时;尝试重新启动事务
在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
在com.mysql.jdbc.MysqlIO。 sqlQueryDirect(MysqlIO.java:2582)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077)
at com.mysql .jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062)
在org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
... 13个


解决方案<正如@JBNizet在评论中指出的那样...

我在ubuntu终端打开了表格,同时试图通过它执行操作hibernate.This是阻止操作在table.I已关闭它,它现在正常工作。



要访问表,我使用 database.tableName 从其他模式访问它,从而避免死锁!


Learning hibernate..please go easy :)

This is my main class i am using to perform operations depending on users choice :

package hibernate_tut_emp;

import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class MyOps {

    public static void main(String[] args) {

        Scanner scnr = new Scanner(System.in);
        System.out.print(" 1 Insert \n 2 Delete \n 3 Update \n 4 Select \n Enter a choice : ");
        int choice = scnr.nextInt();

        SessionFactory sesfact = HibernateUtil.getSessionFactory();
        Session session = sesfact.openSession();
        session.beginTransaction();

        Employee emp = new Employee();


        switch (choice) {
        case 1: //insert
            System.out.print("Enter a name : ");
            String name = scnr.next();
            System.out.print("Enter a surname : ");
            String surname = scnr.next();


            emp.setName(name);
            emp.setSurname(surname);

            session.save(emp);
            session.getTransaction().commit();

            break;
        case 2://delete
            System.out.print("Enter a name to delete : ");

            String delname = scnr.next();
            Query delQuery = session.getNamedQuery("DeleteByName");
            delQuery.setParameter("name", delname);
            delQuery.executeUpdate();
            session.getTransaction().commit();

            break;
        case 3: //update
            System.out.print("Enter a name to update : ");
            String upname = scnr.next();
            System.out.print("Enter a surname to update : ");
            String surn_name = scnr.next();


            Query q = session.getNamedQuery("UpdateSurnameOfName");
            q.setParameter("name", upname);
            q.setParameter("surname", surn_name);
            q.executeUpdate();
            session.getTransaction().commit();

            break;
        case 4:
            System.out.print("Enter a name to show details : ");
            String sh_name = scnr.next();

            session = sesfact.getCurrentSession();
            session.beginTransaction();

            Query s_q = session.getNamedQuery("GetDetailsByName");
            s_q.setParameter("name", sh_name);

            List list = s_q.list();
            Iterator it = list.iterator();

            while(it.hasNext()){
                Employee employee = (Employee)it.next();
                System.out.println(employee.getId()+" "+employee.getName()+" "+employee.getSurname());
            }

            break;
        default:
            System.out.println("wrong choice maadi....");
            break;
        }



    }

}

HibernateUtil.java

package hibernate_tut_emp;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    private static ServiceRegistry serviceRegistry;

    static {

        try {

            Configuration configuration = new Configuration();
            configuration.configure();
            serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties()).build();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);

        } catch (Throwable th) {

            System.err.println("Initial SessionFactory creation failed" + th);
            throw new ExceptionInInitializerError(th);

        }

    }

    public static SessionFactory getSessionFactory() {

        return sessionFactory;

    }
}

Problem

Till now i executed all the queries individually and they all worked as expected but after i placed all of them inside switch i am getting Exception in thread "main" org.hibernate.exception.LockTimeoutException: could not execute statement error.I assume this has something related to connection pool.
Can someone please tell me exactly how its working here and a way to release connections (if its a suggested way) after operation completion?

Console :

 1 Insert 
 2 Delete 
 3 Update 
 4 Select 
 Enter a choice : 1
Oct 03, 2014 11:50:27 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
Oct 03, 2014 11:50:27 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.6.Final}
Oct 03, 2014 11:50:27 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Oct 03, 2014 11:50:27 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Oct 03, 2014 11:50:27 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
Oct 03, 2014 11:50:27 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
Oct 03, 2014 11:50:27 AM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
Oct 03, 2014 11:50:27 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Oct 03, 2014 11:50:27 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Oct 03, 2014 11:50:27 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/hibernate]
Oct 03, 2014 11:50:27 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=root, password=****}
Oct 03, 2014 11:50:27 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
Oct 03, 2014 11:50:27 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
Oct 03, 2014 11:50:28 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Oct 03, 2014 11:50:28 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
Oct 03, 2014 11:50:28 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Oct 03, 2014 11:50:28 AM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
Oct 03, 2014 11:50:28 AM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000102: Fetching database metadata
Oct 03, 2014 11:50:28 AM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000396: Updating schema
Oct 03, 2014 11:50:28 AM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000261: Table found: hibernate.hib1
Oct 03, 2014 11:50:28 AM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000037: Columns: [id, name, surname]
Oct 03, 2014 11:50:28 AM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000108: Foreign keys: []
Oct 03, 2014 11:50:28 AM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000126: Indexes: [primary]
Oct 03, 2014 11:50:28 AM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Enter a name : mohd.
Enter a surname : salim
Hibernate: insert into hib1 (name, surname, id) values (?, ?, ?)
Oct 03, 2014 11:51:27 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1205, SQLState: 41000
Oct 03, 2014 11:51:27 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Lock wait timeout exceeded; try restarting transaction
Oct 03, 2014 11:51:27 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
Exception in thread "main" org.hibernate.exception.LockTimeoutException: could not execute statement
    at org.hibernate.dialect.MySQLDialect$1.convert(MySQLDialect.java:447)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
    at hibernate_tut_emp.MyOps.main(MyOps.java:38)
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
    ... 13 more

解决方案

As pointed out by @JBNizet in comments...

I had the table opened in ubuntu terminal as well while trying to do operations on it via hibernate.This was preventing the operation to be done on table.I have close it and its working fine now.

To access the table, i am using database.tableName method from other schema to access it now hence avoiding the deadlock!

这篇关于Hibernate中的操作超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆