0

在我们的应用程序中,我们使用 grails 框架和 SQL 服务器作为数据库。我们有多个站点,这些站点可以有多个用户(几个用户),如果他们通过 AJAX 访问相同的方法,这可能会导致问题,所以我们将该方法设置为同步方法,并最大限度地减少我们存储数据的数据库交互基于站点的地图,因为来自一个站点的所有用户都将获得相同的数据,如果数据超过 10 秒,我们会从数据库中获取数据并更新地图对象。在这里,我们在从数据库获取站点对象的同步方法的第一行中遇到了很多数据库连接关闭问题。这里有什么问题,我们如何解决这个问题?

def synchronized getData(params){
  Site site = Site.get(params.siteId)
  // Here we are checking whether site data does not exists in map
  // or the data expired (10 second older data) then we get data from
  // database and update the map object

  // Then here we create new list object from the data in map object

  return list
}
4

1 回答 1

-1

如果没有更多信息,很难找出确切的问题。有几件事很突出......

我对synchronized在服务方法前面使用关键字不是特别熟悉,我建议尝试使用静态对象键的同步注释:

private static final myLock = new Object()

@Synchronized("myLock")
void getData() {
  //do stuff
}

或在方法内显式同步

void getData() {
  synchronized(myLock) {
    //do stuff
  }
}

我不知道这是否与您的连接关闭问题有关,但值得一试。

但同样值得注意的是,grails 和 hibernate 提供数据库检索的缓存,因此如果您正在加载已加载到 hibernate 缓存中的相同数据,则无需将其缓存在Map本地... grails 已经为您做到了. Site site = Site.get(params.siteId)如果它最近被调用并且已经被框架缓存,则不会进行数据库调用。

我强烈建议运行一些性能检查,只是在 Map 对象中进行调用与缓存,特别是如果你无论如何都将在 10 秒内到期。

于 2019-09-12T12:56:56.953 回答