javaJDBC(5)-连接池及开源连接池的应用
2014-02-20 08:22
316 查看
说明:
传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数据库连接的建立以及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程序环境中这种耗费资源的动作对系统的性能影响尤为明显。
在多层结构的应用程序中通过连接池(connection pooling)技术可以使系统的性能明显得到提高,连接池意味着当应用程序需要调用一个数据库连接的时候,数据库相关的接口通过返回一个重用数据库连接来代替重新创建一个数据库连接。通过这种方式,应用程序可以减少对数据库连接操作,尤其在多层环境中多个客户端可以通过共享少量的物理数据库连接来满足系统需求。通过连接池技术应用程序不仅可以提高系统性能同时也为系统提高了可测量性。
在java中自己实现连接池的方式如下:
实现了javax.sql.DataSource的才是标准的数据库连接池,按照字面意思,一般称之为数据源。
对于一个已知类的某个方法进行功能上的改变有以下三种方式:
1、定义子类,扩展父类的某个功能。(此处行不通)
2、利用包装设计模式改写原有的类的功能
a、编写一个类实现与被改写类(com.mysql.jdbc.Connection)相同的接口
b、定义一个引用,记住被改写类的实例
c、定义构造方法,传入被改写类的实例
d、对于要改写的方法,改写即可
e、对于不需要改写的方法,调用原有的对象的对应方法
*****包装设计模式
*****默认适配器设计模式
3、动态代理
*****基于接口的动态代理
java.lang.reflect.Proxy
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
作用:返回代理类的实例
参数:loader:类加载器,一般与被代理对象使用同一个
interfaces:被代理对象所实现的接口
h:怎么代理
Object invoke(Object proxy, Method method, Object[] args) :调用原有类的任何方法,都会经过此方
自己实现比较麻烦,这里还是使用开源的DBCP如下:
一.DBCP官网下载jar包如下,并创建数据库配置文件dbcpconfig.properties
一个是dbpc包,一个是pool包。导入构建路径。
二.创建DBCPUtil代替以前的JDBCUtil:
package cn.itcast.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DBCPUtil {
private static DataSource ds;
static{
try {
InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties props = new Properties();
props.load(in);
ds = BasicDataSourceFactory.createDataSource(props);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
三.插u那个键操作数据库的文件DaoDemo
package cn.itcast.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import cn.itcast.util.DBCPUtil;
public class DaoDemo {
@Test
public void add(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = DBCPUtil.getConnection();
System.out.println(conn.getClass().getName());
stmt = conn.prepareStatement("select * from account");
rs = stmt.executeQuery();
while(rs.next()){
System.out.println("-------");
System.out.print(rs.getObject("id"));
System.out.print(rs.getObject("name"));
System.out.print(rs.getObject("money"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBCPUtil.release(null, stmt, conn);
}
}
}
}
说明:
传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数据库连接的建立以及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程序环境中这种耗费资源的动作对系统的性能影响尤为明显。
在多层结构的应用程序中通过连接池(connection pooling)技术可以使系统的性能明显得到提高,连接池意味着当应用程序需要调用一个数据库连接的时候,数据库相关的接口通过返回一个重用数据库连接来代替重新创建一个数据库连接。通过这种方式,应用程序可以减少对数据库连接操作,尤其在多层环境中多个客户端可以通过共享少量的物理数据库连接来满足系统需求。通过连接池技术应用程序不仅可以提高系统性能同时也为系统提高了可测量性。
在java中自己实现连接池的方式如下:
实现了javax.sql.DataSource的才是标准的数据库连接池,按照字面意思,一般称之为数据源。
对于一个已知类的某个方法进行功能上的改变有以下三种方式:
1、定义子类,扩展父类的某个功能。(此处行不通)
2、利用包装设计模式改写原有的类的功能
a、编写一个类实现与被改写类(com.mysql.jdbc.Connection)相同的接口
b、定义一个引用,记住被改写类的实例
c、定义构造方法,传入被改写类的实例
d、对于要改写的方法,改写即可
e、对于不需要改写的方法,调用原有的对象的对应方法
*****包装设计模式
*****默认适配器设计模式
3、动态代理
*****基于接口的动态代理
java.lang.reflect.Proxy
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
作用:返回代理类的实例
参数:loader:类加载器,一般与被代理对象使用同一个
interfaces:被代理对象所实现的接口
h:怎么代理
Object invoke(Object proxy, Method method, Object[] args) :调用原有类的任何方法,都会经过此方
自己实现比较麻烦,这里还是使用开源的DBCP如下:
一.DBCP官网下载jar包如下,并创建数据库配置文件dbcpconfig.properties
一个是dbpc包,一个是pool包。导入构建路径。
二.创建DBCPUtil代替以前的JDBCUtil:
package cn.itcast.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DBCPUtil {
private static DataSource ds;
static{
try {
InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties props = new Properties();
props.load(in);
ds = BasicDataSourceFactory.createDataSource(props);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
三.插u那个键操作数据库的文件DaoDemo
package cn.itcast.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import cn.itcast.util.DBCPUtil;
public class DaoDemo {
@Test
public void add(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = DBCPUtil.getConnection();
System.out.println(conn.getClass().getName());
stmt = conn.prepareStatement("select * from account");
rs = stmt.executeQuery();
while(rs.next()){
System.out.println("-------");
System.out.print(rs.getObject("id"));
System.out.print(rs.getObject("name"));
System.out.print(rs.getObject("money"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBCPUtil.release(null, stmt, conn);
}
}
}
}
相关文章推荐
- JAVA JDBC 连接池的设计应用
- Java性能优化调整集锦[通用/JSP、EJB、JDBC/图形界面应用/ I/O 性能]
- JFreeChart开源图表组件在Java开发中的应用(二)
- java系统学习(十六) --------JDBC及其应用
- 基于JDBC的数据库连接池技术研究与应用
- JAVA中的Class.forName作用及JDBC应用探究
- JavaWeb 第12章 JDBC详解(五)高级应用
- java攻城狮之路--复习JDBC(数据库连接池 : C3P0、DBCP)
- 使用java、jdbc完成一个增删改查的小应用(纯后台开发)
- JDBC的数据库连接池研究与应用
- JAVAWEB开发之事务详解(mysql与JDBC下使用方法、事务的特性、锁机制)和连接池的详细使用(dbcp以c3p0)
- 2、Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)
- 使用spring-loaded开源项目,实现java程序和web应用的热部署
- java自学之路-----jdbc_事务and连接池
- [疯狂Java]JDBC:连接池
- 借助开源工具高效完成Java应用的运行分析
- Java_Jdbc_连接池的testQuery/validationQuery设置
- 借助开源工具高效完成Java应用的运行分析
- Apache Sirona Java应用监视器,能够实时获得每个http/JDBC响应时间
- java oracle jdbc 连接池