Mysql 在JRuby上使用ActiveRecord对MariaDB的第一次查询需要5分钟以上的时间执行
把我的头发拔出来想弄清楚到底发生了什么。。。 以下是设置:Mysql 在JRuby上使用ActiveRecord对MariaDB的第一次查询需要5分钟以上的时间执行,mysql,activerecord,jdbc,jruby,mariadb,Mysql,Activerecord,Jdbc,Jruby,Mariadb,把我的头发拔出来想弄清楚到底发生了什么。。。 以下是设置: Digital Ocean Droplet Ubuntu 15.04.1 JRuby 9.0.3.0 MariaDB 10.0.20 Java 1.8.0_66 宝石: 下面是我用来测试的简单代码: require 'active_record' require 'activerecord-jdbc-adapter' require 'jdbc/mariadb' Jdbc::MariaDB.load_driver class M
Digital Ocean Droplet
Ubuntu 15.04.1
JRuby 9.0.3.0
MariaDB 10.0.20
Java 1.8.0_66
宝石:
下面是我用来测试的简单代码:
require 'active_record'
require 'activerecord-jdbc-adapter'
require 'jdbc/mariadb'
Jdbc::MariaDB.load_driver
class Main < ActiveRecord::Base
establish_connection(
:adapter => "mariadb",
:host => "localhost",
:database => "mydatabase",
:username => "root",
:password => "*******")
end
t1 = Time.now
puts Main.connection.execute("SELECT * FROM my_table")
t2 = Time.now
puts (t2 - t1) / 60
t1 = Time.now
puts Main.connection.execute("SELECT * FROM my_other_table")
t2 = Time.now
puts (t2 - t1) / 60
需要“活动记录”
需要“activerecord jdbc适配器”
需要“jdbc/mariadb”
Jdbc::MariaDB.load\u驱动程序
类Main“mariadb”,
:host=>“localhost”,
:database=>“mydatabase”,
:username=>“root”,
:password=>“*******”)
终止
t1=时间。现在
放置Main.connection.execute(“从我的表中选择*)
t2=现在的时间
put(t2-t1)/60
t1=时间。现在
放置Main.connection.execute(“从我的其他表中选择*)
t2=现在的时间
put(t2-t1)/60
此测试的结果是,第一个查询执行时间超过6.5分钟,第二个查询在几分之一秒内完成
我尝试过使用MySQL而不是MariaDB,结果也一样。我试着降低我的宝石和JRuby的等级。我感到非常困惑,因为在本地它可以像我预期的那样工作,第一个查询几乎是立即返回的
非常感谢您的帮助,谢谢 通常表示smt的生产设置有误,如果不了解供应商和您的具体设置,就很难准确判断
您可以验证它不是特定于JRuby的问题,例如,通过尝试一个普通Java程序执行相同的操作,此时您可能会向支持人员提出问题。是否启用了查询缓存。因此,第二个结果来自缓存如果我将第二个查询更改为(“SELECT*from my_other_table”),它仍然需要几分之一秒的时间每个表中有多少行?如果有数百万行,这些查询将需要几分钟。
require 'active_record'
require 'activerecord-jdbc-adapter'
require 'jdbc/mariadb'
Jdbc::MariaDB.load_driver
class Main < ActiveRecord::Base
establish_connection(
:adapter => "mariadb",
:host => "localhost",
:database => "mydatabase",
:username => "root",
:password => "*******")
end
t1 = Time.now
puts Main.connection.execute("SELECT * FROM my_table")
t2 = Time.now
puts (t2 - t1) / 60
t1 = Time.now
puts Main.connection.execute("SELECT * FROM my_other_table")
t2 = Time.now
puts (t2 - t1) / 60