使用连接池前后连接数据库的对比
2018-06-17 23:14:56来源:未知 阅读 ()
首先,为什么使用JDBC?
JDBC是指java数据库连接,是面向关系型数据库的,它实际就是一个JAVA封装的API,我们采用Java语言执行sql语句,对(各种)数据库操作,具有跨平台性。不管是什么关 系数据库,我们都可以通过jdbc实现数据库的连接和操作。
然后,为什么使用连接池?
我们不仅仅要求连接到数据库,更需要连接的效率。这就需要连接池了。也就是说,我提前连接好n个连接,需要的时候,我在池里取就行,不用再现创现用了,速度快了,效 率高了。连接池有c3p0,dbcp等,有文章专门介绍过几种连接池的区别。结论就是c3p0是使用最广泛的。
下面比较使用连接池前后的效率
1 建一个pool管理类 Mpool
package com.db;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Mpool {
private static Mpool mPool;
private ComboPooledDataSource dataSource;
static {
mPool = new Mpool();
}
//构造方法
public Mpool() {
try {
dataSource = new ComboPooledDataSource("mysql");
dataSource.setUser("root");
dataSource.setPassword("root123");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test02");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setInitialPoolSize(2);
dataSource.setMinPoolSize(1);
dataSource.setMaxPoolSize(10);
dataSource.setMaxStatements(50);
dataSource.setMaxIdleTime(60);
} catch (PropertyVetoException e) {
throw new RuntimeException(e);
}
}
public final static Mpool getInstance() {
return mPool;
}
public final Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("无法从数据源获取连接 ", e);
}
}
}
2 测试类 main
import java.sql.*;
import com.db.Mpool;;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("使用连接池.......................");
for (int i = 0; i < 20; i++) {
long beginTime = System.currentTimeMillis();
//1 获取一个连接
Connection conn = Mpool.getInstance().getConnection();
try {
//2 这个连接要干嘛,封装在PreparedStatement准备对象中.不可以采用拼接的形式了,采用占位符。
/* PreparedStatement pstmt = conn
.prepareStatement("insert into user(userName,password) value("+i+",111)");
*/
PreparedStatement pstmt = conn
.prepareStatement("insert into user(userName,password) values(?,?)");
pstmt.setInt(1, i);
pstmt.setInt(2, i);
//3 准备好以后,执行准备对象
/* 3-1执行查询对象 ResultSet rs = pstmt.executeQuery();*/
//3-2 执行插入 更新等的准备对象
//Boolean a= pstmt.execute(); //如果第第一个结果是结果集 返回true。
//建议使用executeUpadate() 执行结果可以看到,0表示没有执行
int a= pstmt.executeUpdate();
System.out.println(a);
/* 如果是查询语句,则re存在返回结果。
while (rs.next()) {
re.get内容
}*/
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
long endTime = System.currentTimeMillis();
System.out.println("第" + (i + 1) + "次执行花费时间为:"
+ (endTime - beginTime));
}
}
}
3 只是用jdbc测试
import java.sql.*;
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("不使用连接池................................");
for (int i = 0; i < 20; i++) {
long beginTime = System.currentTimeMillis();
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception e1) {
e1.printStackTrace();
}
String url = "jdbc:mysql://localhost:3306/test02";
String user = "root";
String password = "root123";
Connection conn=null;
try {
//直接使用jdbc获取conn
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
PreparedStatement pstmt = conn
.prepareStatement("insert into user(userName,password) values(?,?)");
pstmt.setInt(1, i);
pstmt.setInt(2, i);
int a =pstmt.executeUpdate();
System.out.println(a);
/* while (rs.next()) {
// get content
}*/
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
long endTime = System.currentTimeMillis();
System.out.println("第" + (i + 1) + "次执行花费时间为:"
+ (endTime - beginTime));
}
}
}
可以发现: 使用jdbc直接连接数据库,每次连接需要的时间都差不多,40秒左右。而使用连接池的话,第一次连接需要的时间比较长,因为要做一些初始化操作吧,第二次获取连接的时间大概是1秒,很快的。
另外注意,对数据库的操作也是有影响的,比如查询和写入操作,时间就不一样。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:数据库查询
- PHP访问MySQL查询超时怎么办 2020-03-09
- MySQL中使用WHERE子句的方法 2019-10-25
- thinkphp5框架前后端分离项目实现分页功能的方法分析 2019-10-08
- 关于laravel后台模板laravel-admin select框的使用详解 2019-10-08
- 面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然 2019-09-30
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash