【问题标题】:Scala ActiveRecord performance issue when used with play framework与播放框架一起使用时的 Scala ActiveRecord 性能问题
【发布时间】:2013-12-06 18:12:32
【问题描述】:

在我的 Play 应用程序中,我尝试了 Scala ActiveRecord,这似乎是一个不错的 orm,并声称具有高性能。但是,在空数据库上运行以下命令需要 850 毫秒(每个查询约 425 毫秒):

User.findBy("email", "test")
User.findBy("email", "test")

从 mysql 控制台运行相同的程序大约需要 10 毫秒。我很想使用这个库,但我负担不起这么低的性能。 orm 使用BoneCP 进行连接管理,但我找不到任何关于如何正确配置它的建议。

您知道可能导致性能问题的原因吗?

生成的sql如下所示:

Select
  users11.current_country as users11_current_country,
  users11.email as users11_email,
  users11.password_hash as users11_password_hash,
  users11.surname as users11_surname,
  users11.first_name as users11_first_name,
  users11.birth_city as users11_birth_city,
  users11.birth_date as users11_birth_date,
  users11.id as users11_id,
  users11.current_city as users11_current_city,
  users11.birth_country as users11_birth_country
From
  users users11
Where
  (users11.email = ?)
limit 1 offset 0

编辑

经过进一步调查,我知道问题可能是由 Play 框架引起的。我在非播放环境(简单​​ App)中测试了调用,两个查询的响应时间分别为 117 和 5 毫秒。但是,我还对 play 的 DB.getConnetion() 执行了一个简单的 SQL 查询进行了测试,结果是 2 毫秒。这可能是连接池问题吗?

Squeryl 在两种环境(游戏和简单应用)中的响应时间相似

【问题讨论】:

    标签: database scala activerecord jdbc playframework-2.0


    【解决方案1】:

    例如,如果User模型如下:

    case class User(
      @Required var email: String,
      @Required var firstName: String,
      @Required var surname: String
    ) extends ActiveRecord {
      var currentCountry: String = _
      var birthCity: String = _
      var birthDate: java.util.Date = _
      var birthCountry: String = _
    
      @Required(on="create")
      @Length(min=8)
      @Confirmation
      @Transient
      var password: String = _
    
      var passwordConfirmation: String = _
    
      var passwordHash: String = _
    
      override def beforeSave() {
        if (password != null && password != "")
          passwordHash = LibraryOfSomething.toHash(password)
      }
    }
    
    object User extends ActiveRecordCompanion[User] with PlayFormSupport[User]
    

    习惯于select方法:

    User.where(_.email === "test")
        .select(u => User(u.email, u.firstName, u.surname))
        .headOption
    

    【讨论】:

    • 哇,罪魁祸首是这一行: val passwordHash = BCrypt.hashpw(plainPassword, BCrypt.gensalt()) 所以它在每个查询上运行哈希算法。我非常感谢你。昨天我花了一整天的时间试图找出它为什么工作这么慢:(另外,正如我所见,你在 lib 上工作。干得好,谢谢你创造它。
    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多