java - Java 的 mysql 执行时间

标签 java mysql optimization

我正在回顾我之前构建和发布的一个应用程序。当时没有太多时间优化,但现在有时间稍微优化一下。

我有一个 java DAL 类,它从数据库中加载一个包含项目的对象,如下所示:

sql = "SELECT COUNT(*) FROM projects";
count = execute(sql) // this returns the count

sql = "SELECT p.*, m.name AS clientName"
...
sql = sql + " FROM projects p"
sql = sql + " LEFT JOIN clients m ON p.clientID = m.id";

Project[] p = execute(sql, count); //this returns Project array

我遇到的问题是计数脚本需要超过 4 秒才能运行,而选择脚本需要大约 2 秒。虽然这是异步传递给表现层的,但是6秒还是很长的等待时间(projects表只有300条左右的记录)。

我认为我可以通过添加存储过程并可能向脚本添加额外的过滤器(例如“where active=1”)来改进这一点。但我想知道是否有人可以提出总体上更好的解决方案?

谢谢

编辑:我一直在用 System.nanoTime() 做一些进一步的测试,我发现计数脚本中 4 秒(3.8 秒)的最大块发生在一行中的执行函数内:

Connection c = getCon();

getCon 函数执行此操作:

if (con == null) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(db_connect_string,db_userid,db_password);
}
...

所以我现在有一个新问题 - 为什么获取数据库连接需要 3.8 秒?

最佳答案

尝试使用 SELECT COUNT(1) FROM projects 而不是 COUNT(*)。众所周知,它可以提高一些性能。

编辑

关于您的编辑,看起来您没有使用连接池机制。如果你不使用一个,每次调用都会尝试打开一个新的连接,这可能会很昂贵。另一方面,连接池维护一个连接池,随时可以使用。如果您在代码中执行 connection.close(),它将直接转到池中以供重用,而不是完全断开连接。

您可能想查看 list常用的连接池。我更喜欢 DBCP 或 C3P0。

注意:如果您使用 WebSphere/WebLogic/JBoss 等应用程序服务器,则无需担心这一点,因为它已经为您处理好了。您所要做的就是让您的应用程序使用 DataSource 而不是直接使用 DriverManager.getConnection() 并在您的应用程序服务器上配置连接。

关于java - Java 的 mysql 执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10245493/

相关文章:

flutter - 何时在 Flutter 中使用 FutureBuilder

java - 阻止应用程序绑定(bind)到已绑定(bind)的套接字

java - 在安卓中创建视频

java - 尝试创建数组时出现堆栈溢出错误

php - 如何加速Mysql和PHP?

java - Java 中的 Ripple Out 整数数组优化

java 字符串数字比较器对 DropDownlist 进行排序

mysql - 选择没有前沿零的最大 INT

mysql - 如何使用mysql将一个表中的所有列集成到另一个表的一列中

php - 将mysql db中的单词按顺序排列