【问题标题】:JDBC with MySQL really slow, don't know whyJDBC 和 MySQL 真的很慢,不知道为什么
【发布时间】:2010-11-06 23:13:43
【问题描述】:

我的 Java 代码和 MySQL 数据库之间的连接速度非常慢。我不知道瓶颈在哪里。

我的程序或多或少是一个聊天机器人。用户输入一些内容,我的程序将句子拆分为单词并将每个单词的单词发送到数据库。如果它在那里找到了一些东西,用户就会得到一个输出。 数据库在外部服务器上,但我也尝试连接到我旁边的电脑。两者都很慢。

我在另一个我通常工作的地方尝试了一次连接,并且大部分时间都很快。

我的 SQL 代码:

从信息信息中选择 info.INFORMATION,INFO_SCHLUESSEL sch
WHERE LCASE(sch.SCHLUESSELWORT) LIKE '" + input + "%' AND info.ID_INFO = sch.ID_INFO
Order BY info.PRIORITAET DESC LIMIT 1;

(记起来了,如果对理解sql代码有帮助的话:
schluessel = 钥匙
Schluesselwort = 关键词
优先级 = 优先级)

我的 Java 数据库代码或多或少是标准的东西:

字符串驱动 = "com.mysql.jdbc.Driver";
字符串 dbase = "jdbc:mysql://bla";
字符串 dbuser = "bla";
字符串 dbpw = "bla";

Class.forName(驱动程序);
Connection con = DriverManager.getConnection(dbase, dbuser, dbpw);
语句 stmt = con.createStatement();

结果集 rs = stmt.executeQuery(query);
而 (rs.next())
{
ergebnis = rs.getString("info.INFORMATION");
}

rs.close();
stmt.close();
con.close();

编辑:

我已经尝试了这个 DBCP 一段时间,但我似乎无法让它工作。它似乎和旧连接一样慢。这是我使用的网站提供的示例:

GenericObjectPool connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://bla", "bla", "bla");
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
PoolingDriver 驱动程序 = new PoolingDriver();
driver.registerPool("example",connectionPool);
连接连接 = DriverManager.getConnection("jdbc:apache:commons:dbcp:example");

【问题讨论】:

  • 你在使用连接池吗?
  • 不,还没有。但我现在会调查一下。

标签: java mysql jdbc


【解决方案1】:

我认为这值得对设计进行讨论。您可以做一些事情来提高性能。由于您在这里没有保留任何内容,因此最好将内存中的所有数据预加载到某个自定义 java 对象、映射、列表或其他任何内容中,然后在内存中查找该单词并获得结果。另一种方法可能是使用批处理语句,这样您就不会继续为每个单词创建和释放连接。哦,如果使用批处理语句,请确保将批处理大小设置为适当的数字,最好是素数

【讨论】:

  • 预加载所有数据?对于小型数据库,这可能是可能的,但数据库越大,用户通过 Internet 加载的内容就越多。搜索可能会更快,但在计算机获得所需的所有数据之前,它比我的旧方法花费的时间更长。
  • 那么基本上设计保证了你为什么将基于单词的数据存储在关系数据库中的要求。如果您是为了坚持而这样做,我认为该解决方案没有意义。更好的方法是让它基于文件并使用一些 IR 库进行索引和搜索。
  • 也许这会是一个更好的方法,但我很高兴能以某种方式完成我的要求。从未想过基于文件的系统也是一种可能性。也许下一次......这只是一个原型。它必须以某种方式工作,如果它不完美也没什么大不了的。
【解决方案2】:

我怀疑是连接设置导致了问题。值得计算这需要多长时间:

Connection con = DriverManager.getConnection(dbase, dbuser, dbpw);

如果是这样,请查看Apache Commons DBCP,它允许您共享数据库连接。

【讨论】:

  • 是的,这似乎是问题所在......仅此一项大约需要 2 秒。我会阅读你的链接。
  • 非常好(您发现了问题)。池将为您建立和维护连接,并按需分发它们,而不会产生连接时间开销。
  • 我试过了,但我似乎无法让它工作。也许你可以看看我在原帖中编辑的连接池代码?
  • 您是否提前构建池,并在需要时简单地调用 DriverManager.getConnection()(即,不为每次迭代设置整个池?)
  • 我写了一个测试类,除了我上面发布的(连接池)之外什么都不做,并告诉我花了多长时间。我只是看到,在我的旧代码中,我为每个单词都建立了一个新的连接......也许如果我改变它,没有这个池的东西就足够快了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
相关资源
最近更新 更多