`
zheng2java
  • 浏览: 1601 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JDBC与连接池

阅读更多
    JDBC是我们初学JAVA后与数据库打交道用的最初方法,相信都记犹新呵。
    最近找到一套这方面的资料,看完后对JDBC有了更新的认识与了解,下面与大家分享一下小小心得呵。
    我们使用JDBC最原始的一些接口主要是Connection,PreparedStatement,Statement,ResultSet这四大接口,一直只是肤浅的认为将其定义成接口是为了更好的通用及扩展,具体就不知道了。其实我们打开JDK后可以观察到,在java.sql包中大部分都是接口,特别是这些与数据库直接联系的,都是以接口形式出现,那就有疑问了,我们平时明明就是操纵的是这些接口了,但在JDK中没有发现这些接口的具体实现类呢?
    呵,这种设计所包含的智慧不得不让人折服。数据库产品在世面上耳熟能详的就已经有好几种,如SQL SERVER,ORACLE,MYSQL,DB2等,而每种JAVA所支持的数据库都必须实现该套JAVA提供的接口并提供具体操纵该数据库的方法,并且,这些方法在JAVA这套JDBC接口中都已经定义好了,如果你熟悉JAVA设计思想的里氏代换原则,那么话说到此处,你就应该什么都能明白了。
    里氏代换原则:父类能出现的地方,那么子类就一定适合出现!并且,调用的一定是子类的方法。
    再来聊聊连接池。连接池顾名思义就是里面放了好多好多个数据库连接。呵呵,与数据库建立连接其实是非常耗性能的一件事情,但在实际应用中,对于数据库的多连接应用是有一定要求的,一个应用支持容纳的连接越多,应用性能就越快。
    连接池其实就是在一个应用起动的时候一次性加载建立多个连接放入内存中待用,大家都知道从内存中取数据是最有效率的,而且用完后我们调close() 方法其实并不是真正的把该连接资源释放掉,而是又将其连接放回到连接池中备用了。所以这一机制的实行,把高耗都置于程序起动的时候了。随后带来的好处可想而知。
    要说连接池原理嘛,我也不知道,呵呵。不过倒是模拟了一个粗糙得很的假连接池呵,大家见笑了。连接池,可理解一个数据库连接容器不?说到容器,无非就是JAVA类库中的集合类最适合做容器了,小弟不才,使用了LinkedList做为连接容器,因为考虑到回收连接(也就是将用完的连接再插入到该List中)时性能方面,该List肯定比ArrayList快。
    哎,话不多说,看代码吧:
package com.zheng.jdbc.connection;

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

import com.zheng.jdbc.conpool.MyConnectionPool;

public final class DateBaseUtils {
private static DateBaseUtils instance = null;
private static MyConnectionPool myConnectionPool = null;
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";

/**
* 私有构造方法,单例模式
*/
private DateBaseUtils(){}

/**
* 返回该工具类的唯一实例
            * @return
*/
public static DateBaseUtils getInstance(){
if(instance == null) {
synchronized (DateBaseUtils.class) {
if(instance == null){
instance = new DateBaseUtils();
}
}
}
return instance;
}

//静态代码块,保证驱动只会注册一次
static{
try {
Class.forName(DRIVER);
myConnectionPool = new MyConnectionPool();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/**
* 获取一个数据库连接
* @return
*/
public Connection getConnection() throws SQLException{
return myConnectionPool.getConnection();
}

/**
* 释放所有数据库资源
* @param rs 数据库结果集
* @param ps 预编译SQL语句对象
* @param con 数据库连接对象,因为在myConnectionPool对象中模拟了一个数据库连接池机制,
* 所以该处释放指将连接放入到连接池中,而不是真正意义上的释放
*/
public void free(ResultSet rs,Statement ps,Connection con)throws Exception{
try {
rs.close();
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
try {
ps.close();
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
try {
myConnectionPool.free(con);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}

/**
* 重载方法
* @param ps
* @param con
*/
public void free(Statement ps,Connection con) throws Exception{
try {
ps.close();
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
try {
myConnectionPool.free(con);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

/**
* 重载方法,将数据连接放回连接池中
* @param con
*/
public void free(Connection con) throws Exception{
try {
myConnectionPool.free(con);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

/**
*该类为模拟连接池的类
*
*/
package com.zheng.jdbc.conpool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;

/**
* 实现一个简单的连接池机制
*
* @author Administrator zheng2java@sina.com 郑冬华
*
*/
public class MyConnectionPool {

private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String USERNAME = "scott";
private static final String PASSWORD = "tiger";

private static int initCount = 5;//初始化的连接数
private static int currentCount = 0;//连接创建计数器
private static int maxCount = 10;//最大创建连接数

private static LinkedList<Connection> connectionPool = new LinkedList<Connection>();// 用于存储连接,因为linkedList存储删除快,所以在存储删除频繁的时候用它性能好

/*
* 初始化该类时就在静态块中构造五个数据库连接
*/
static{
try {
for (int i = 0; i < initCount; i++) {
connectionPool.addLast(createConnection());// 将一个连接添加到该linkedList的结尾处,实现后进先出的算法
currentCount++;
}
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}

public MyConnectionPool() {}

/*
* 创建一个连接
* @return 返回一个数据库连接
* @throws Exception
*/
private static Connection createConnection() throws Exception {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);//用Java JDBC数据操作机制中的DriverManager类来创建一个连接
}

/**
* 从模拟连接池中得到一个连接
* @return Connection
*/
public Connection getConnection() throws SQLException{
synchronized (connectionPool) {
if(0 < connectionPool.size()){
return connectionPool.removeFirst();//将连接池(list)中最后一个连接移除并返回,也就是得到一个连接操作
}
if(0 == connectionPool.size() && currentCount < maxCount){//一般连接池都是成几何倍来创建连接的
for(int i = 0 ; i < initCount ; i++){
try {
connectionPool.addLast(createConnection());
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
}else if(0 == connectionPool.size() && currentCount == maxCount){
throw new SQLException("已经超过连接最大数了...");
}
return connectionPool.removeFirst();//将连接池(list)中最后一个连接移除并返回,也就是得到一个连接操作
}
}

/**
* 因为数据库连接池的机制,对于连接的处理不是真正的释放资源,而是将一个连接放回至连接池中,也就是list中。
* @param con 一个数据库连接
*/
public void free(Connection con){
connectionPool.addLast(con);//将用完后传递回来的连接放回至连接中
}
}

以上代码大致能实现一个连接池效用,其实还可以更通用些用动态代理来对其进行更一步优化并支持多数据库的,呵,但本人较懒,实在想睡啦。所以,先goodnight啦
分享到:
评论

相关推荐

    Java-jdbc数据库连接池总结.doc

    Java JDBC 数据库连接池技术是Java应用程序访问数据库的关键优化手段,尤其在Web应用程序中,它解决了传统JDBC连接方式存在的效率低下和资源浪费问题。Java JDBC(Java Database Connectivity)是Java语言与各种...

    常用jdbc数据库连接jar包,数据库连接池jar包

    2. C3P0:这是一个开源的JDBC连接池,提供了比DBCP更高级的功能,如连接测试、空闲连接检测、自动扩展等。C3P0通过组合多个数据源来实现连接池,可以更好地控制并发和资源管理。 这些jar包的收集意味着开发者可以...

    JDBC数据库连接池实现原理

    1. **选择连接池实现**:首先,我们需要选择一个合适的数据库连接池实现,如Apache的DBCP、C3P0、HikariCP或Tomcat JDBC连接池等。这些连接池库提供了管理和维护数据库连接的功能。 2. **配置连接池**:在应用的...

    spring声明式事务管理+jdbc+连接池

    spring声明式事务管理+jdbc+连接池 包内为代码,下载可直接执行。 一直用s2sh,感觉hibernate不好用,所以写了一个spring声明式事务管理+jdbc+连接池。

    jdbc和连接池的jar包

    总的来说,JDBC和连接池是Java开发中与数据库交互的基石。JDBC提供了标准的接口,而连接池则优化了数据库连接的管理,两者结合可以提升Java应用在处理数据库任务时的性能和稳定性。在处理大量并发请求或高负载场景下...

    04-JDBC-连接池.xmind

    JDBC与连接池

    基于jdbc的连接池开发技术

    ### 基于JDBC的连接池开发技术详解 #### 摘要 本文深入探讨了Java中的数据库访问机制——JDBC,以及如何利用连接池技术优化数据库连接管理,提高应用性能。首先简述了JDBC的基础知识及其在Java应用程序与数据库...

    Tongweb5中配置JDBC连接池

    Tongweb5是一款基于Java的Web应用服务器,它支持配置JDBC连接池来管理数据库连接。本文将详细介绍如何在Tongweb5中配置JDBC连接池,以及Web应用如何通过JNDI(Java Naming and Directory Interface)查找并使用这些...

    jdbc连接池配置(优化连接速度)

    **JDBC连接池的配置与选择:** 常见的JDBC连接池有HikariCP、C3P0、DBCP、Druid等。每种连接池都有各自的配置参数,例如最小连接数、最大连接数、超时时间、测试连接SQL等。合理设置这些参数可以有效控制连接的创建...

    JDBC数据库连接池的简单实现.rar

    总结来说,JDBC数据库连接池如Druid的实现主要涉及以下几个步骤:引入依赖、配置连接池属性、在代码中使用连接池以及可选的监控和扩展。通过这些方式,我们可以有效地管理和优化数据库连接,提高应用的运行效率。

    JDBC连接池(通用basedao)可直接用的模板

    在Java开发中,数据库操作是不可或缺的一部分,而JDBC连接池是提高数据库访问效率、优化系统资源使用的重要技术。本文将深入探讨JDBC连接池的概念、工作原理,并以"通用basedao"模板为例,讲解如何在实际项目中应用...

    jdbc数据库连接池

    1. C3P0:一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。 2. DBCP(Apache Commons DBCP):Apache提供的数据库连接池,基于Jakarta-pool实现。 3. HikariCP:性能极高的连接池...

    简单的jdbc连接池类

    本示例中的"简单的jdbc连接池类"实现了一个基本的数据库连接池功能,非常适合初学者理解和实践。 首先,我们来理解`jdbc`。JDBC(Java Database Connectivity)是Java语言用来与各种数据库进行交互的一种标准接口。...

    CH07MySQL连接器JDBC和连接池.ppt

    CH07MySQL连接器JDBC和连接池.ppt

    jdbc数据库连接池工程文件

    - **C3P0**:一个开源的JDBC连接池,提供了强大的异常处理和性能监控。 - **DBCP**:Apache提供的数据库连接池,基于Jakarta-pool实现。 - **HikariCP**:目前性能最佳的连接池,设计目标是速度、简单性和零内存...

    完美的java jdbc连接池实例

    本实例提供了完美的Java JDBC连接池配置,适用于Oracle、MySQL和SQL Server等主流数据库,允许开发者轻松地在不同数据库之间切换方言。 首先,让我们了解什么是JDBC连接池。JDBC(Java Database Connectivity)是...

    java JDBC连接池

    Java JDBC连接池是一种高效管理数据库连接的技术,它允许应用程序重复使用已经建立的数据库连接,从而减少频繁创建和关闭连接带来的开销。在大型系统中,尤其是高并发环境下,使用连接池能够显著提升性能并降低资源...

Global site tag (gtag.js) - Google Analytics