为什么第一次连接mysql数据库很慢?

时间:2022-02-09 16:58:07
我是使用JDBC + 数据库连接池 访问局域网里的数据库的,不知道为什么当程序启动后第一次打开网页,页面上需要从数据库取数据的地方需要等待10秒左右才能显示出来,如果把数据放到我本机*问没有问题,分析了半天,试了很多办法就是没能解决解决,请大家帮我分析分析到底是什么原因?

22 个解决方案

#1


网速太慢了!

#2


不太明白,帮顶下

#3


该回复于2010-08-05 17:19:59被版主删除

#4


该回复于2010-08-06 15:00:23被版主删除

#5


你用MYSQL的客户端执行SQL也会很慢吗?

#6


tomcat 需要加载  第一次都是这样的  转换成缓存后  就快了  

#7


引用 1 楼 tang6237422 的回复:
网速太慢了!

局域网应该无所谓吧

#8


引用 5 楼 kimsung 的回复:
你用MYSQL的客户端执行SQL也会很慢吗?

这个跟客户端没用关系吧。
不管用不用客户端,我都要从数据库里取数据显示到页面上呀

#9


如果你用客户端还是很慢, 说明不是你的开发环境问题啊.
你可以从你本地到你数据库所在的服务器之间的连接上考虑.
要是客户端如果很快.
那你要从你程序开始找的啊.

#10


第一次很慢, 有可能是java编译问题. 
你给程序调用数据库部分加上时间看看了吗?
是在执行SQL的时候慢,还是具体哪一部分慢.

在程序里面可以加

long startTime=System.currentTimeMillis(); //开始时间

....... 你的source code

long endTime=System.currentTimeMillis(); //结束时间

最后打印这2个时间. 你可以给多个地方加.看看具体哪一部分执行的慢.

你这样提问,可能性太多. 要先把问题最小化. 从那里开始入手吧. 这样会不会更好啊?

#11


引用 9 楼 kimsung 的回复:
如果你用客户端还是很慢, 说明不是你的开发环境问题啊.
你可以从你本地到你数据库所在的服务器之间的连接上考虑.
要是客户端如果很快.
那你要从你程序开始找的啊.

对不起,我有点乱了,你说的客户端是指数据库的客户端还是指其它什么?

#12


什么都可以的啊.
你可以在控制台打 

mysql -u 用户 -p 密码 -h host -P 端口(如果不是默认端口)

再connect 数据库. 试试快不快啊.

#13


引用 10 楼 kimsung 的回复:
第一次很慢, 有可能是java编译问题. 
你给程序调用数据库部分加上时间看看了吗?
是在执行SQL的时候慢,还是具体哪一部分慢.

在程序里面可以加

long startTime=System.currentTimeMillis(); //开始时间

....... 你的source code

long endTime=System.currentTimeMillis()……

我测试过了,就是在连接数据库的时候停了10秒左右,取数据挺快的,而且只要服务器不重启,以后都挺快的

#14


你可以把连接数据库地方的代码粘过来看看吗?

#15



这是连接数据库的代码

package com.csrme.util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DataBaseConnection {
private static DataBaseConnection dbPool;
private DataSource dataSource;

static {
dbPool = new DataBaseConnection();
}

public DataBaseConnection() {
try {
Context initCtx = new InitialContext();
if (initCtx == null)
throw new Exception("连接池异常 001");
Context ctx = (Context) initCtx.lookup("java:comp/env");
if (ctx != null)
dataSource = (DataSource) ctx.lookup("Csrme_System_DBpool");
if (dataSource == null)
throw new Exception("连接池异常 002");
} catch (Exception e) {
e.printStackTrace();
}
}

public final static DataBaseConnection getInstance() {
return dbPool;
}

public final Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("连接数据库错误异常 003", e);
}
}

public static void close(ResultSet rs, Statement st, Connection conn) {// 关闭连接

try {
if (null != rs) {
rs.close();
}
if (null != st) {
st.close();
}
if (null != conn) {
conn.close();
}
} catch (SQLException sql) {
sql.printStackTrace();
}
}

}

#16


或者你试试用MYSQL的随意客户端连接试试吧. 是不是很慢.
如果很慢, 那是数据库那边的问题了.

#17



这是数据库连接池代码
<?xml version="1.0" encoding="UTF-8"?>

<Context path="/Csrme_System" docBase="Csrme_System" debug="5">

<!-- 数据源配置,放在tomcat下conf/catalina/localhost包下 -->
<Resource name="Csrme_System_DBpool"   
       auth="Container"   
       type="javax.sql.DataSource"   
       driverClassName="com.mysql.jdbc.Driver"   
       url="jdbc:mysql://192.168.0.222:3306/csrme?useUnicode=true&amp;characterEncoding=utf-8"   
       username="root"   
       password="111111"   
       maxActive="10"   
       maxIdle="20"
       maxWait="1000" />
       
</Context>

#18


如果是数据库问题.
可以看一下以下的连接.

http://translate.googleusercontent.com/translate_c?hl=zh-CN&langpair=en%7Czh-CN&u=http://mirrors.dotsrc.org/mysql/doc/refman/4.1/en/dns.html&rurl=translate.google.com.hk&usg=ALkJrhj9QwoQhrPJcLG7zMoETNYoZUEzIA

#19


引用 16 楼 kimsung 的回复:
或者你试试用MYSQL的随意客户端连接试试吧. 是不是很慢.
如果很慢, 那是数据库那边的问题了.

我准备再测试一下。

#20


看你的代码也看不出什么问题啊.
一般在连接数据库的时候

#21


引用 20 楼 kimsung 的回复:
看你的代码也看不出什么问题啊.
一般在连接数据库的时候

我认为也是在连接数据库的时候哪边需要设置什么东西
谢谢你的热心解答

#22


 my.ini 文件 [mysqld] 下
   skip-name-resolve

#1


网速太慢了!

#2


不太明白,帮顶下

#3


该回复于2010-08-05 17:19:59被版主删除

#4


该回复于2010-08-06 15:00:23被版主删除

#5


你用MYSQL的客户端执行SQL也会很慢吗?

#6


tomcat 需要加载  第一次都是这样的  转换成缓存后  就快了  

#7


引用 1 楼 tang6237422 的回复:
网速太慢了!

局域网应该无所谓吧

#8


引用 5 楼 kimsung 的回复:
你用MYSQL的客户端执行SQL也会很慢吗?

这个跟客户端没用关系吧。
不管用不用客户端,我都要从数据库里取数据显示到页面上呀

#9


如果你用客户端还是很慢, 说明不是你的开发环境问题啊.
你可以从你本地到你数据库所在的服务器之间的连接上考虑.
要是客户端如果很快.
那你要从你程序开始找的啊.

#10


第一次很慢, 有可能是java编译问题. 
你给程序调用数据库部分加上时间看看了吗?
是在执行SQL的时候慢,还是具体哪一部分慢.

在程序里面可以加

long startTime=System.currentTimeMillis(); //开始时间

....... 你的source code

long endTime=System.currentTimeMillis(); //结束时间

最后打印这2个时间. 你可以给多个地方加.看看具体哪一部分执行的慢.

你这样提问,可能性太多. 要先把问题最小化. 从那里开始入手吧. 这样会不会更好啊?

#11


引用 9 楼 kimsung 的回复:
如果你用客户端还是很慢, 说明不是你的开发环境问题啊.
你可以从你本地到你数据库所在的服务器之间的连接上考虑.
要是客户端如果很快.
那你要从你程序开始找的啊.

对不起,我有点乱了,你说的客户端是指数据库的客户端还是指其它什么?

#12


什么都可以的啊.
你可以在控制台打 

mysql -u 用户 -p 密码 -h host -P 端口(如果不是默认端口)

再connect 数据库. 试试快不快啊.

#13


引用 10 楼 kimsung 的回复:
第一次很慢, 有可能是java编译问题. 
你给程序调用数据库部分加上时间看看了吗?
是在执行SQL的时候慢,还是具体哪一部分慢.

在程序里面可以加

long startTime=System.currentTimeMillis(); //开始时间

....... 你的source code

long endTime=System.currentTimeMillis()……

我测试过了,就是在连接数据库的时候停了10秒左右,取数据挺快的,而且只要服务器不重启,以后都挺快的

#14


你可以把连接数据库地方的代码粘过来看看吗?

#15



这是连接数据库的代码

package com.csrme.util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DataBaseConnection {
private static DataBaseConnection dbPool;
private DataSource dataSource;

static {
dbPool = new DataBaseConnection();
}

public DataBaseConnection() {
try {
Context initCtx = new InitialContext();
if (initCtx == null)
throw new Exception("连接池异常 001");
Context ctx = (Context) initCtx.lookup("java:comp/env");
if (ctx != null)
dataSource = (DataSource) ctx.lookup("Csrme_System_DBpool");
if (dataSource == null)
throw new Exception("连接池异常 002");
} catch (Exception e) {
e.printStackTrace();
}
}

public final static DataBaseConnection getInstance() {
return dbPool;
}

public final Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("连接数据库错误异常 003", e);
}
}

public static void close(ResultSet rs, Statement st, Connection conn) {// 关闭连接

try {
if (null != rs) {
rs.close();
}
if (null != st) {
st.close();
}
if (null != conn) {
conn.close();
}
} catch (SQLException sql) {
sql.printStackTrace();
}
}

}

#16


或者你试试用MYSQL的随意客户端连接试试吧. 是不是很慢.
如果很慢, 那是数据库那边的问题了.

#17



这是数据库连接池代码
<?xml version="1.0" encoding="UTF-8"?>

<Context path="/Csrme_System" docBase="Csrme_System" debug="5">

<!-- 数据源配置,放在tomcat下conf/catalina/localhost包下 -->
<Resource name="Csrme_System_DBpool"   
       auth="Container"   
       type="javax.sql.DataSource"   
       driverClassName="com.mysql.jdbc.Driver"   
       url="jdbc:mysql://192.168.0.222:3306/csrme?useUnicode=true&amp;characterEncoding=utf-8"   
       username="root"   
       password="111111"   
       maxActive="10"   
       maxIdle="20"
       maxWait="1000" />
       
</Context>

#18


如果是数据库问题.
可以看一下以下的连接.

http://translate.googleusercontent.com/translate_c?hl=zh-CN&langpair=en%7Czh-CN&u=http://mirrors.dotsrc.org/mysql/doc/refman/4.1/en/dns.html&rurl=translate.google.com.hk&usg=ALkJrhj9QwoQhrPJcLG7zMoETNYoZUEzIA

#19


引用 16 楼 kimsung 的回复:
或者你试试用MYSQL的随意客户端连接试试吧. 是不是很慢.
如果很慢, 那是数据库那边的问题了.

我准备再测试一下。

#20


看你的代码也看不出什么问题啊.
一般在连接数据库的时候

#21


引用 20 楼 kimsung 的回复:
看你的代码也看不出什么问题啊.
一般在连接数据库的时候

我认为也是在连接数据库的时候哪边需要设置什么东西
谢谢你的热心解答

#22


 my.ini 文件 [mysqld] 下
   skip-name-resolve