在我的Play应用程序中,我尝试了Scala ActiveRecord,它似乎是一个很好的orm,并声称它具有很高的性能。但是,在一个空数据库上运行以下命令需要850 ms (每个查询~425 ms):
User.findBy("email", "test")
User.findBy("email", "test")在mysql控制台上运行相同的程序需要10 mysql。我很想使用这个图书馆,但我负担不起这么低的性能。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编辑
经过进一步的调查,我可以看出,这个问题可能是由游戏框架引起的。我在非播放环境(simple )中测试了调用,两个查询的响应时间分别为117和5ms。但是,我也对play的DB.getConnetion()进行了测试,在它上执行一个简单的SQL查询,结果是2ms。这有可能是连接池问题吗?
Squeryl在两种环境(play和简单的app)中都提供类似的响应时间。
发布于 2013-12-07 08:19:22
例如,如果用户模型如下:
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))
.headOptionhttps://stackoverflow.com/questions/20430763
复制相似问题