Java操作数据库——使用连接池连接数据库
Java操作数据库——使用连接池连接数据库
摘要:本文主要学习了如何使用JDBC连接池连接数据库。
传统方式和连接池方式
传统方式的步骤
使用传统方式在Java中使用JDBC连接数据库,完成一次数据库的操作,一般有以下几个步骤:
加载驱动。
建立连接。
执行SQL语句。
释放连接。
传统方式的弊端
每一次对数据库的操作都要建立一次连接,并且会将得到的Connection对象加载到内存中,导致消耗了大量的内存和时间。如果短时间有很多需要进行建立连接的操作,会导致占用很多系统资源,甚至会导致服务器崩溃。
同建立连接相对应,每次使用都需要手动释放连接,如果忘记释放连接或者程序出现异常未能成功释放,会导致内存泄露。
此外,传统方式并不能控制连接的数量,如果连接的人数过多,会导致无限制的创建连接对象,导致内存开销过大,服务器崩溃。
连接池的步骤
创建连接池并配置连接属性。
使用连接池获取连接。
连接池的优势
每次需要连接数据库时,不需要建立连接,而是通过连接池获取,由连接池提供连接。
在使用完连接后,不需要手动释放连接,而是交由连接池释放连接。
可以通过连接池控制连接的数量,在连接池里的连接可多次重复使用,避免了无限制创建连接的问题。
使用连接池
使用C3P0连接池
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
导入jar包:
c3p0-0.9.5.2.jar
在当前项目的代码根目录 src 下新建名为 c3p0-config.xml 的配置文件,注意文件名称不可改变,内容如下:
<c3p0-config>
<!-- 连接名称 -->
<named-config name="mysql">
<!-- 接数据库的驱动类名 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 连接属性 -->
<property name="jdbcUrl">jdbc:mysql://192.168.35.128:3306/demo</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 当连接池用完时等待获取新连接的时间,超时后将抛出SQLException,单位毫秒,如设为0则无限期等待。默认为0。 -->
<property name="checkoutTimeout">5000</property>
<!-- 当连接用尽后,一次获取的连接个数 -->
<property name="acquireIncrement">2</property>
<!-- 初始连接数 -->
<property name="initialPoolSize">1</property>
<!-- 最小连接数 -->
<property name="minPoolSize">3</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">5</property>
</named-config>
</c3p0-config>
程序代码:
public class TestDataPool {
// 根据配置文件里的名称创建连接池
public static ComboPooledDataSource cpds = new ComboPooledDataSource("mysql"); /**
* 主程序
*/
public static void main(String[] args) {
// 模拟多次对数据库的查询操作
for (int i = 0; i < 6; i++) {
new Thread(new Runnable() {
@Override
public void run() {
select();
}
}, "线程" + i).start();
}
} /**
* 查询程序
*/
public static void select() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// 获取连接并执行SQL
try {
conn = cpds.getConnection();
pstmt = conn.prepareStatement("select * from student where id = 906");
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
使用DBCP连接池
DBCP是Apache上的一个Java连接池项目,是一个依赖Jakarta项目commons-pool对象池机制的数据库连接池。DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP。
导入jar包:
commons-dbcp-1.4.jar commons-pool-1.5.5.jar
在当前项目的代码根目录 src 下新建名为 dbcp.properties 的配置文件,文件名需要同代码中引用的文件名一致,内容如下:
# 接数据库的驱动类名
driverClassName=com.mysql.jdbc.Driver
# 连接属性
url=jdbc:mysql://192.168.35.128:3306/demo
username=root
password=123456
# 初始化连接数
initialSize=10
# 最大连接数
maxActive=15
程序代码:
public class TestDBCP {
// 根据配置文件里的名称创建连接池
private static DataSource source = null;
static {
Properties pros = new Properties();
InputStream is = TestDBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");
try {
pros.load(is);
source = BasicDataSourceFactory.createDataSource(pros);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 主程序
*/
public static void main(String[] args) {
// 模拟多次对数据库的查询操作
for (int i = 0; i < 6; i++) {
new Thread(new Runnable() {
@Override
public void run() {
select();
}
}, "线程" + i).start();
}
} /**
* 查询程序
*/
public static void select() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// 获取连接并执行SQL
try {
conn = source.getConnection();
pstmt = conn.prepareStatement("select * from student where id = 906");
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
使用Druid连接池
Druid是阿里巴巴出品的数据源,而且是淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
导入jar包:
druid-1.0.9.jar
在当前项目的代码根目录 src 下新建名为 druid.properties 的配置文件,文件名需要同代码中引用的文件名一致,内容如下:
# 接数据库的驱动类名
driverClassName=com.mysql.jdbc.Driver
# 连接属性
url=jdbc:mysql://192.168.35.128:3306/demo
username=root
password=123456
# 最大连接数
maxActive=15
# 最长等待时间
maxWait=3000
# 配置初始化连接数
initialSize=1
# 配置最大活动连接数
maxActive=10
程序代码:
public class TestDruid {
// 根据配置文件里的名称创建连接池
private static DataSource source = null;
static {
Properties pros = new Properties();
InputStream is = TestDruid.class.getClassLoader().getResourceAsStream("druid.properties");
try {
pros.load(is);
source = DruidDataSourceFactory.createDataSource(pros);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 主程序
*/
public static void main(String[] args) {
// 模拟多次对数据库的查询操作
for (int i = 0; i < 6; i++) {
new Thread(new Runnable() {
@Override
public void run() {
select();
}
}, "线程" + i).start();
}
} /**
* 查询程序
*/
public static void select() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// 获取连接并执行SQL
try {
conn = source.getConnection();
pstmt = conn.prepareStatement("select * from student where id = 906");
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(Thread.currentThread().getName() + "\t" + rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString("address"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Java操作数据库——使用连接池连接数据库的更多相关文章
- java操作mongodb(连接池)(转)
原文链接: java操作mongodb(连接池) Mongo的实例其实就是一个数据库连接池,这个连接池里默认有10个链接.我们没有必要重新实现这个链接池,但是我们可以更改这个连接池的配置.因为Mong ...
- java操作redis redis连接池
redis作为缓存型数据库,越来越受到大家的欢迎,这里简单介绍一下java如何操作redis. 1.java连接redis java通过需要jedis的jar包获取Jedis连接. jedis-2.8 ...
- Java操作数据库——手动实现数据库连接池
Java操作数据库——手动实现数据库连接池 摘要:本文主要学习了如何手动实现一个数据库连接池,以及在这基础上的一些改进. 部分内容来自以下博客: https://blog.csdn.net/soonf ...
- Java操作数据库——使用JDBC连接数据库
Java操作数据库——使用JDBC连接数据库 摘要:本文主要学习了如何使用JDBC连接数据库. 背景 数据持久化 数据持久化就是把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应 ...
- JDBC数据源(DataSource)数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。
JDBC数据源(DataSource)的简单实现 数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用. 2.数据源提供了一种简单获取数据库连接的方式,并能在内部通 ...
- java操作数据库:增删改查
不多bb了直接上. 工具:myeclipse 2016,mysql 5.7 目的:java操作数据库增删改查商品信息 test数据库的goods表 gid主键,自增 1.实体类Goods:封装数据库数 ...
- Java自己动手写连接池四
Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...
- Java自己动手写连接池三
Java自己动手写连接池三,核心代码; package com.kama.cn; import java.sql.Connection;import java.util.ArrayList;impor ...
- JDBC 数据库连接 Java操作数据库 jdbc快速入门
JDBC基本概念 Java DataBase Connectivity 数据库连接 java操作数据库 本质上(sun公司的程序员)定义的一套操作关系型数据库的规则 既接口 更新内容之前 代码 pa ...
随机推荐
- Python基础-day01-4
多文件项目的演练 开发 项目 就是开发一个 专门解决一个复杂业务功能的软件 通常每 一个项目 就具有一个 独立专属的目录,用于保存 所有和项目相关的文件 一个项目通常会包含 很多源文件 目标 在项目中 ...
- 一起学Vue之模板语法
概述 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTM ...
- SuperMap iDesktop .NET 10i制图技巧-----如何贴图
当我们在没有模型数据的情况下,我们只能通过造白膜来模拟三维建筑了,但是光秃秃的建筑物显然缺乏代入感,因此需要贴图来给场景润色,本文介绍如何给道路贴图和如何给白膜贴图 道路贴图: 1.打开二维道路数据 ...
- Jenkins工程中SQL语句执行的方法
前言 网上很多jenkins工程中基于shell或批处理方式调用sql文件执行sql命令的方式,大部分都是需要基于sql文件来完成的,因此在sql语句发生变化时需要去jenkins服务端修改对应的sq ...
- Android组件体系之Activity启动模式解析
本文主要分析Activity的启动模式及使用场景. 一.Activity启动模式浅析 1.standard 标准模式,系统默认的启动模式.在启动Activity时,系统总是创建一个新的Activity ...
- 用Python在25行以下代码实现人脸识别
在本文中,我们将看到一种使用Python和开放源码库开始人脸识别的非常简单的方法. OpenCV OpenCV是最流行的计算机视觉库.最初是用C/C++编写的,现在它提供了Python的API. Op ...
- 前端小白webpack学习(四)
.less文件与.scss文件使用与.css文件相仿 less-loader使用需要借助less插件,终端输入npm i less less-loader -D安装; sass-loader使用需要借 ...
- python批量插入数据到es和读取es数据
一.插入数据 1.首先准备类似如下数据 {"_type": "type1", "_id": 1, "_index": & ...
- 基于webpack实现多html页面开发框架七 引入第三方库如jquery
一.解决什么问题 1.如何引入第三方库,如jquery等 二.引入jquery方法 1.下载jquery.min.js放到assets/lib下面 2.安装copy-webpack-plugin,将已 ...
- Dynamics 365中的分派(Assign)。
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...