JDBCDemo.java:
package com.itheima.jdbc; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import com.itheima.pool.MyPool; public class JDBCDemo { public static void main(String[] args) { Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
MyPool pool = new MyPool();
try {
conn = pool.getConnection();
ps = conn.prepareStatement("select * from account");
rs = ps.executeQuery();
while(rs.next()) {
String name = rs.getString(2);
String salary = rs.getString(3);
System.out.println(name + " : " + salary);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
//关闭数据库连接
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
rs = null;
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
ps = null;
}
}
/*
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
rs = null;
}
}
*/
//这里不能关闭数据库连接对象connection,应该将其返还给数据库连接池
pool.returnConn(conn);
}
}
}

MyPool.java:

package com.itheima.pool;

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger; import javax.sql.DataSource; public class MyPool implements DataSource{ //list集合保存数据库连接池中的connection对象
private static List<Connection> pool = new LinkedList<Connection>();
//静态代码块。用于初始化list集合。即初始化数据库连接池,创建5个connection对象保存当中以备使用
static {
try {
Class.forName("com.mysql.jdbc.Driver");
for(int i = 0; i < 5; i++) {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day11", "root", "root");
pool.add(conn);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
} @Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
} //重写父类的getConnection()方法,返回数据库连接池中的一个connection对象。
//假设数据库连接池中connection对象都已被使用。即都被取走未返还,则创建3个connection对象保存当中供以后使用
@Override
public Connection getConnection() throws SQLException {
if(pool == null) {
for(int i = 0; i < 3; i++) {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day11", "root", "root");
pool.add(conn);
}
}
return pool.remove(0);
}
//创建新方法。用于返回数据库连接对象connection。由于dao层用完数据库的连接后,不应该将其销毁,而是应该将其返还给数据库连接池
public void returnConn(Connection conn) {
pool.add(conn);
}
@Override
public Connection getConnection(String username, String password)
throws SQLException {
// TODO Auto-generated method stub
return null;
} }

以上代码是数据库连接池的简单使用,可是有一个问题就是当你使用数据库连接池技术时,你须要改动JDBCDemo.java文件里finally代码块中的代码,即conn对象在finally代码块里不应该通过conn.close();方法关闭,而是应该返还给数据库连接池。

这里我们採用“动态代理”的方式,解决该问题,即finally代码块里依旧调用conn.close();方法。

此时以上两个java文件的代码更改例如以下:

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import com.itheima.pool.MyPool; public class JDBCDemo { public static void main(String[] args) { Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
MyPool pool = new MyPool();
try {
conn = pool.getConnection();
ps = conn.prepareStatement("select * from account");
rs = ps.executeQuery();
while(rs.next()) {
String name = rs.getString(2);
String salary = rs.getString(3);
System.out.println(name + " : " + salary);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
//关闭数据库连接
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
rs = null;
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
ps = null;
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
conn = null;
}
}
}
}
}
package com.itheima.pool;

import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger; import javax.sql.DataSource; public class MyPool implements DataSource{ //list集合保存数据库连接池中的connection对象
private static List<Connection> pool = new LinkedList<Connection>();
//静态代码块,用于初始化list集合,即初始化数据库连接池,创建5个connection对象保存当中以备使用
static {
try {
Class.forName("com.mysql.jdbc.Driver");
for(int i = 0; i < 5; i++) {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day11", "root", "root");
pool.add(conn);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
} @Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
} //重写父类的getConnection()方法。返回数据库连接池中的一个connection对象,
//假设数据库连接池中connection对象都已被使用。即都被取走未返还,则创建3个connection对象保存当中供以后使用
@Override
public Connection getConnection() throws SQLException {
if(pool == null) {
for(int i = 0; i < 3; i++) {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day11", "root", "root");
pool.add(conn);
}
}
final Connection conn = pool.remove(0); //使用动态代理改造close方法
//newProxyInstance(类载入器, 要改造的conn对象所实现的全部接口, 匿名内部类)
Connection proxy = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("close".equals(method.getName())) {
//假设是close方法。我们进行重写
returnConn(conn);
return null;
} else {
//假设是其它方法,直接调用
return method.invoke(conn, args);
}
}
});
System.out.println("获取一个连接对象,剩余连接对象:" + pool.size());
return proxy;
}
//创建新方法,用于返回数据库连接对象connection,由于dao层用完数据库的连接后,不应该将其销毁,而是应该将其返还给数据库连接池
public void returnConn(Connection conn) {
pool.add(conn);
System.out.println("返还一个连接对象,剩余连接对象:" + pool.size());
}
@Override
public Connection getConnection(String username, String password)
throws SQLException {
// TODO Auto-generated method stub
return null;
} }

执行结果:

获取一个连接对象,剩余连接对象:4
a : 1000.0
b : 1000.0
c : 1000.0
返还一个连接对象,剩余连接对象:5

java数据库连接池技术简单使用的更多相关文章

  1. java数据库连接池技术原理(浅析)

    在执行数据库SQL语句时,我们先要进行数据连接:而每次创建新的数据库的连接要消耗大量的资源,这样,大家就想出了数据库连接池技术.它的原理是,在运行过程中,同时打开着一定数量的数据库连接,形成数据连接池 ...

  2. Java数据库连接池详解

    http://www.javaweb1024.com/java/JavaWebzhongji/2015/06/01/736.html 对于共享资源,有一个很著名的设计模式:资源池(Resource P ...

  3. 【Java】数据库连接池技术

    JDBC的问题 在程序中,我们经常要建立与数据库的连接,之后再关闭这个连接.我们知道,数据库连接对象的创建是比较消耗系统性能的,这些频繁的操作势必会消耗大量的系统资源.因此我们需要采用更高效的数据库访 ...

  4. Java学习:数据库连接池技术

    本节内容 数据库连接池 Spring JDBC : JDBC Template 数据库连接池 1.概念:其实就是一个容器(集合),存放数据库连接的容器 当系统初始化好后,容器中会申请一些连接对象,当用 ...

  5. Java数据库连接池

    转载过来的,最近在做一个小网站,准备使用这种方法.     Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...

  6. java数据库连接池dbcp的使用

    近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开发模式 ...

  7. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

  8. .数据库连接池技术:DBCP和C3P0

    数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...

  9. Java数据库连接池的几种配置方法(以MySQL数据库为例)

    Java数据库连接池的几种配置方法(以MySQL数据库为例) 一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1 ...

随机推荐

  1. Unexpected Exception caught setting 'username' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'username' with value ['艾格尼丝', ]

    问题场景: 在使用表单向Action传递数据的时候, 遇到了这个问题, 导致了空指针异常. 问题描述: 10:14:56.622 [http-nio-8080-exec-45] ERROR com.o ...

  2. 使用Maven构建JavaEE项目

    学习要点 Maven简介 Maven构建项目 MyEclipse中Maven的使用 Maven简介 Maven作用 对第三方依赖库进行统一的版本管理 统一的目录结构,统一各平台各IDE目录 统一的软件 ...

  3. Linux-01 虚拟机Linux的安装

    学习要点 虚拟机VMware Workstation 11.0 CentOS6.5的安装 Linux简介 Linux 一种免费开源的操作系统 常作为服务器的操作系统使用 基本思想:一切都是文件 常用发 ...

  4. day13 函数模块之序列化 random 模块 os模块 sys模块 hashlib模块 collections模块

    json import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 ...

  5. pc端移动端兼容的大图轮播

    body, html { width: 100%; } * { margin:; padding:; list-style: none; } .haha { list-style-type: none ...

  6. 微信小程序之裁剪图片成圆形

    前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在github上看了一些例子,一般剪裁图片用的都是方形,所以自己打算写一个小组件,可以把图片剪裁成圆形,主 ...

  7. 第二天,学习if,变量,注释

    zz_age = 31guss_age=int(input("input your answer:"))if guss_age == zz_age: print ("Yo ...

  8. 转载 js弹出框、对话框、提示框、弹窗总结

    转载:https://blog.csdn.net/huileiforever/article/details/9464659 一.JS的三种最常见的对话框   //================== ...

  9. 关于在Safari浏览器中将网页添加到主屏幕的相关设置(自定义图标,启动动画,自定义名称)

    在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上,让我们的web页面看起来像native那样 第一步: 第二步: 第三步: 到这里还没结束:我们还要进行相关设置才能使我们的应用更像原生 ...

  10. 【实验吧】Just Click

    拿到答案需要正确地点击按钮 格式:simCTF{ } 解题链接: http://ctf5.shiyanbar.com/re/rev4.exe 由于最近在学数据库是c#编程,发现是c#,于是用.net ...