Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java阻止对Spring MVC中方法的并发访问_Java_Hibernate_Spring Mvc - Fatal编程技术网

Java阻止对Spring MVC中方法的并发访问

Java阻止对Spring MVC中方法的并发访问,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,我想使用SpringMVC在表中添加一些虚拟数据 代码如下:- 在Dao中 public int generateData(){ int iData = 80001; String qry = "SELECT p FROM TestDomain p"; List<TestDomain> runQry = daoHelper.findByQuery(qry); if(runQry.size()!=0){ TestDomain td

我想使用SpringMVC在表中添加一些虚拟数据

代码如下:-

在Dao中

    public int generateData(){
    int iData = 80001;
    String qry = "SELECT p FROM TestDomain p";
    List<TestDomain> runQry = daoHelper.findByQuery(qry);
    if(runQry.size()!=0){
        TestDomain tdom = runQry.get((runQry.size()-1));
        iData = tdom.getNum_data();
        iData++;
    }


    return iData;
}
现在的问题是,当多个用户同时点击generate函数时,会为他们分配相同的数据,这会在不同的客户端将数据推送到表中时导致重复。我如何防止这种两面派

编辑

1,我已经在我的generate方法上尝试了java synchronized关键字,但它不起作用,可能是因为我在服务层中使用了spring的事务性关键字


2,我不能使用数据库序列生成唯一的数据,数据必须来自generate方法

这不是Spring MVC数据重复问题。应用程序需要通过控制对生成id的方法的并发访问来防止数据重复。首选方法是使用数据库序列来获取下一个id,而不是应用程序生成id


如果您不能使用数据库序列,但仍然希望使用generate方法,那么您的应用程序需要通过添加JAVA synchronized关键字以生成方法(和/或)锁定任何对象以允许单线程访问该方法来控制并发性。这将使其他用户/线程等待执行此方法。

这不是Spring MVC数据重复性问题。应用程序需要通过控制对生成id的方法的并发访问来防止数据重复。首选方法是使用数据库序列来获取下一个id,而不是应用程序生成id


如果您不能使用数据库序列,但仍然希望使用generate方法,那么您的应用程序需要通过添加JAVA synchronized关键字以生成方法(和/或)锁定任何对象以允许单线程访问该方法来控制并发性。这将使其他用户/线程等待执行此方法。

请查看hibernate中的
@Version
注释。这可能会解决你的问题


或者,您可以在执行操作时使用悲观锁定和锁定表

看看hibernate中的
@Version
注释。这可能会解决你的问题


或者,您可以在执行操作时使用悲观锁定和锁定表

java synchronized关键字对我不起作用。可能是因为我使用的是spring事务服务。我已经编辑了我的原始问题,以包含这段信息。您是否尝试将整个generate方法保存在一个同步块中,比如这个公共int-generateData(){synchronized{…}}}是的,我将整个generate方法保存在同步块中尝试锁定任何对象-请看这里,java synchronized关键字对我不起作用。可能是因为我使用的是spring事务服务。我已经编辑了我的原始问题,以包含这段信息。您是否尝试将整个generate方法保存在一个同步块中,如此public int generateData(){synchronized{…}}}是的,我将整个generate方法保存在同步块中尝试锁定任何对象-请参见此处,谢谢Shervin,然而,我并不关心更新同一条记录,我只是同时插入多条记录,因此我怀疑乐观锁定在这种情况下是否会有帮助。如果我错了,请纠正我。你的读写是在同一笔交易中吗?在事务方法完成之前,Hibernate不会写入数据库。因此,您需要确保您的事务也与写入/读取数据库的方式相匹配。最好使用锁,而不是同步。ie:我的generate方法读取数据库并生成要写入的数据,实际的写入方法在不同的事务中..谢谢Shervin,但是我不关心更新同一条记录,我只是同时插入多条记录,因此我怀疑乐观锁定在这种情况下对我有帮助。如果我错了,请纠正我。你的读写是在同一笔交易中吗?在事务方法完成之前,Hibernate不会写入数据库。因此,您需要确保您的事务也与写入/读取数据库的方式相匹配。最好使用锁,而不是同步。ie:我的generate方法读取数据库并生成要写入的数据,实际写入方法在不同的事务中。。
 entityManager.merge(entity);