【问题标题】:How to lock access to a database while using it in java by Hibernate? [closed]Hibernate在java中使用数据库时如何锁定对数据库的访问? [关闭]
【发布时间】:2016-03-20 01:26:40
【问题描述】:

我正在使用 JPA/HIBERNATE 来管理我的 mysql 数据库(读取和写入),其他应用程序使用相同的数据库(只读)。 我想要做的是:当我在java(休眠)中编辑我的数据库时,我希望所有其他应用程序都可以读取旧值,当我的程序完成时,我想切换到程序修改的新值。

我该怎么做?

这里是代码

public static Integer  (Equipment equipment)
         {
             Session session = factory.openSession();
             Transaction tx = null;
             Integer equipementID = null;
             try{
                 tx = session.beginTransaction();
                 equipementID = (Integer) session.save(equipment); 
                 tx.commit();
             }catch (ConstraintViolationException e) {
                 if (tx!=null) tx.rollback();
             }finally {
             }
             return equipementID;
         }


    public static void parseFile (String filePath1) throws IOException
           {
             Scanner s1 = new Scanner(new File(filePath1));
             s1.useDelimiter("\\s*fish\\s*");

             while (s1.hasNextLine())
             {
                Scanner s2 = new Scanner (s1.nextLine()); 
                s2.useDelimiter(";");

                while (s2.hasNext()) {
                     String hostName = s2.next();
                     int asNum=s2.nextInt();
                     String type=s2.next();
                     String addrIp=s2.next();
                     String vendor=s2.next();
                     String model=s2.next();
                     String version=s2.next();
                     String function=s2.next();
                     String usage=s2.next();

                     if (asNum==3215)
                         addEquipmentToDatabase(new Equipment(hostName,0,addrIp,"ftipnn",asNum,model,type,vendor,function,usage,version,1,0));
else
                     updateEquipment(equipment,new Equipment(hostName,0,addrIp,"domain",asNum,model,type,vendor,function,usage,version,1,0));
            }


                }
                s2.close();
             }
             s1.close();
           }



    public static void updateEquipment (Equipment actualEquipment,Equipment newEquipment)
        {
            Transaction tx = session.beginTransaction();
            Query query = session.createSQLQuery("UPDATE equipment SET hostName = '"+newEquipment.getHostName()+"',"
                                                                  +"parity= '"+newEquipment.getParity()+"',"
                                                                  +"addrIP= '"+newEquipment.getAddrIP()+"',"
                                                                  +"domainExtension= '"+newEquipment.getDomainExtension()+"',"
                                                                  +"asNum= '"+newEquipment.getAsNum()+"',"
                                                                  +"model= '"+newEquipment.getModel()+"',"
                                                                  +"type= '"+newEquipment.getType()+"',"
                                                                  +"vendor ='"+newEquipment.getVendor()+"',"
                                                                  +"function= '"+newEquipment.getFunction()+"',"
                                                                  +"utilization= '"+newEquipment.getUtilization()+"',"
                                                                  +"version= '"+newEquipment.getVersion()+"',"
                                                                  +"idSite= '"+newEquipment.getIdSite()+"',"
                                                                  +"idProfile= '"+newEquipment.getIdProfile()+"' "+
                                                                  "WHERE hostName LIKE '"+actualEquipment.getHostName()+"'") ;
            query.executeUpdate();
            tx.commit();
        }

【问题讨论】:

  • 请分享您迄今为止使用过的任何代码。见这里:stackoverflow.com/help/mcve
  • 我加入了一个操作数据库的代码示例。

标签: java mysql database hibernate jpa


【解决方案1】:

您所描述的涉及设置适当的ISOLATION 级别。

有四种不同类型的隔离级别:

  • 读取未提交
  • 读取已提交
  • 可重复读取
  • 可序列化

大多数数据库通常在默认情况下执行已提交的读取,这意味着在该事务已提交其工作之前,其他事务的更改对任何其他查询都不可见,但是允许读取以读取现有的 (没有更改的数据)。

读取提交的缺点是,如果一个事务正在更改足够多的行,这些锁可能会升级到更高级别(页或表)并导致性能瓶颈问题。这通常是为什么建议在批量操作期间执行小的提交点,以防止表被锁定以供其他事务使用。

MySQL 有点不同,因为它的默认设置是可重复读取

可重复读取已提交读取之间的区别在于 MySQL 将持有一个读锁直到事务结束,而其他数据库将释放一个读锁立即在资源上。换句话说,如果读取应用程序执行长时间运行的事务,则其他应用程序的读取操作可能会影响您在写入应用程序中的写入能力,反之亦然。

【讨论】:

  • 谢谢 这是我应该在hibernate的属性中添加的属性吗?
  • 隔离级别可以在您的数据库中配置(如果您想更改整个数据库的全局状态)或在您创建它时在单个事务中配置。这与休眠无关。
  • 谢谢,很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2011-10-22
  • 1970-01-01
  • 2012-12-13
  • 2011-06-20
  • 1970-01-01
  • 2016-10-07
相关资源
最近更新 更多