编写一个基本的连接池来实现连接的复用&一些工程细节上的优化

 1 package it.cast.jdbc;
 2
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.SQLException;
 6 import java.util.LinkedList;
 7
 8 public class MyDataSource {
 9
10     private static String url = "jdbc:mysql://localhost:3306/jdbc";
11     private static String username = "root";
12     private static String password = "123";
13
14     private static int initCount = 5;
15     private static int maxCount = 10;
16     private int currentCount = 0;
17
18     private LinkedList<Connection> connectionPool = new LinkedList<Connection>();
19
20     public MyDataSource() {
21         try {
22             for (int i = 0; i < initCount; i++) {
23
24                 this.connectionPool.addLast(this.createConnection());
25
26                 this.currentCount++;
27             }
28         } catch (SQLException e) {
29             throw new ExceptionInInitializerError(e);
30         }
31
32     }
33
34     public Connection getConnection() throws SQLException {
35         synchronized (connectionPool) {
36             if (this.connectionPool.size() > 0) {
37                 return this.connectionPool.removeFirst();
38             }
39             if (this.currentCount < maxCount) {
40                 this.currentCount++;
41                 return this.createConnection();
42             }
43             throw new SQLException("NO Connection!!");
44         }
45
46     }
47
48     public void free(Connection conn) {
49         this.connectionPool.addLast(conn);
50     }
51
52     private Connection createConnection() throws SQLException {
53         return DriverManager.getConnection(url, username, password);
54     }
55 }

MyDataSource

  1 package it.cast.jdbc;
  2
  3 import java.sql.CallableStatement;
  4 import java.sql.Connection;
  5 import java.sql.DriverManager;
  6 import java.sql.PreparedStatement;
  7 import java.sql.ResultSet;
  8 import java.sql.SQLException;
  9 import java.sql.Statement;
 10
 11 public class jdbcUtils {
 12
 13     private static String url = "jdbc:mysql://localhost:3306/jdbc?generateSimpleParameterMetadata=true";
 14     private static String user = "root";
 15     private static String password = "123";
 16
 17     private static MyDataSource myDataSource = null;
 18
 19     private jdbcUtils() {
 20
 21     }
 22
 23     static {
 24         try {
 25             Class.forName("com.mysql.jdbc.Driver");
 26             myDataSource =new MyDataSource();
 27         } catch (ClassNotFoundException e) {
 28             e.printStackTrace();
 29         }
 30     }
 31
 32     public static Connection getConnection() throws SQLException {
 33         return myDataSource.getConnection();
 34     }
 35
 36     public static void free(ResultSet rs, Statement st, Connection conn) {
 37
 38         try {
 39             if (rs != null)
 40                 rs.close();
 41         } catch (SQLException e) {
 42             e.printStackTrace();
 43         } finally {
 44
 45             try {
 46                 if (st != null)
 47                     st.close();
 48             } catch (SQLException e) {
 49                 e.printStackTrace();
 50             } finally {
 51
 52                 try {
 53                     if (conn != null)
 54                         //conn.close();
 55                         myDataSource.free(conn);
 56                 } catch (Exception e) {
 57                     e.printStackTrace();
 58                 }
 59             }
 60
 61         }
 62
 63     }
 64
 65     public static void free(ResultSet rs, PreparedStatement ps, Connection conn) {
 66
 67         try {
 68             if (rs != null)
 69                 rs.close();
 70         } catch (SQLException e) {
 71             e.printStackTrace();
 72         } finally {
 73
 74             try {
 75                 if (ps != null)
 76                     ps.close();
 77             } catch (SQLException e) {
 78                 e.printStackTrace();
 79             } finally {
 80
 81                 try {
 82                     if (conn != null)
 83                         //conn.close();
 84                         myDataSource.free(conn);
 85                 } catch (Exception e) {
 86                     e.printStackTrace();
 87                 }
 88             }
 89
 90         }
 91
 92     }
 93     public static void free(ResultSet rs, CallableStatement cs, Connection conn) {
 94
 95         try {
 96             if (rs != null)
 97                 rs.close();
 98         } catch (SQLException e) {
 99             e.printStackTrace();
100         } finally {
101
102             try {
103                 if (cs != null)
104                     cs.close();
105             } catch (SQLException e) {
106                 e.printStackTrace();
107             } finally {
108
109                 try {
110                     if (conn != null)
111                         //conn.close();
112                         myDataSource.free(conn);
113                 } catch (Exception e) {
114                     e.printStackTrace();
115                 }
116             }
117
118         }
119
120     }
121 }

jdbcUtils

 1 package it.cast.jdbc;
 2
 3 import java.sql.Connection;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7
 8 public class Base {
 9
10     static Connection conn = null;
11
12     public static void main(String[] args) throws SQLException, ClassNotFoundException {
13         for (int i = 0; i < 20; i++) {
14             Connection conn = jdbcUtils.getConnection();
15             System.out.println(conn);
16             //jdbcUtils.free(null, null, conn);
17         }
18     }
19
20     static void test() throws SQLException, ClassNotFoundException {
21
22
23         // 2.建立连接
24         conn = jdbcUtils.getConnection();
25
26         // 3.创建语句
27         Statement st = conn.createStatement();
28
29         // 4.执行语句
30         ResultSet rs = st.executeQuery("select * from user");
31
32         // 5.处理结果
33         while (rs.next()) {
34             System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t"
35                     + rs.getObject(3)+"\t" + rs.getObject(4));
36         }
37
38         //6.释放资源
39         jdbcUtils.free(rs, st, conn);
40     }
41
42 }

Base

时间: 2024-10-12 14:21:50

编写一个基本的连接池来实现连接的复用&一些工程细节上的优化的相关文章

Redis客户端连接方式Hiredis简单封装使用,连接池、屏蔽连接细节

工作需要对Hiredis进行了简单封装,实现功能: 1.API进行统一,对外只提供一个接口: 2.屏蔽上层应用对连接的细节处理: 3.底层采用队列的方式保持连接池,保存连接会话: 4.重连时采用时间戳进行控制,每隔一定时间(3s)重连一次,防止频繁重试造成的不必要浪费. 先看一下Hiredis的常用数据结构与API: //hiredis/hiredis.h /* Context for a connection to Redis */ typedef struct redisContext {

DBCP连接池与c3p0连接池

1.   DBCP连接池 2.  c3p0连接池(参见上一篇的使用步骤http://www.cnblogs.com/qlqwjy/p/7545012.html)

Mybatis 打开连接池和关闭连接池性能对比

1  创建数据库表 -- phpMyAdmin SQL Dump -- version 4.2.11 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: 2016-08-02 18:13:50 -- 服务器版本: 5.6.21 -- PHP Version: 5.6.3 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+0

c3p0连接池和druid连接池的使用

1.c3p0连接池 没有配置文件的情况下 @Test public void T1() throws SQLException, PropertyVetoException { ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setUser("root"); cpds.setPassword("root"); cpds.setJdbcUrl("jdbc:mysql://local

Go语言之从0到1实现一个简单的Redis连接池

Go语言之从0到1实现一个简单的Redis连接池 前言 最近学习了一些Go语言开发相关内容,但是苦于手头没有可以练手的项目,学的时候理解不清楚,学过容易忘. 结合之前组内分享时学到的Redis相关知识,以及Redis Protocol文档,就想着自己造个轮子练练手. 这次我把目标放在了Redis client implemented with Go,使用原生Go语言和TCP实现一个简单的Redis连接池和协议解析,以此来让自己入门Go语言,并加深理解和记忆.(这样做直接导致的后果是,最近写JS时

【转】Druid连接池一个设置引发的血案

https://my.oschina.net/haogrgr/blog/224010 今天在一台配置很低的机器上运行批量更新的程序~~~ 大概跑了三十分钟~~~这配置~~~这程序~~~ 然后华丽丽的报异常了~~~ 具体异常是这样的, DEBUG: (BaseJdbcLogger.java:132)    ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@4d4e22e1] [2014-07-17 15:1

数据源于与连接池

为什么使用数据源和连接池 我们现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接.因此针对这种情况,提出了数据源和连接池的概念.使用数据源和连接池可以达到复用数据库连接的目的. 数据源和连接池概念 其实,数据源和连接池是两个不同的概念.有些人会把它们弄混.数据源是用来连接数据库,获得Connection 对象的,在Java 中使用javax.sql.DataSource接口来表示

web java -- 连接池 -- 概述

1. 连接池的实现原理 1. 创建连接池 首先要创建一个静态的连接池.这里的"静态"是指池中的连接时在系统初始化时就分配好的,并且不能够随意关闭.Java 提供了很多容器类可用来构建连接池,例如Vector.Stack等.在系统初始化时,根据配置创建连接并放置在连接池中,以后所使用的连接都是从该连接池中获取的,这样就可以避免连接随意建立.关闭造成的开销. 2. 分配.释放策略 创建好连接池后,需要提供一套自定义的分配.创建策略以保证数据库连接的有效复用.当客户请求数据库连接时,首先看连

Tomcat7和mysql连接池dbcp方式的配置方法和测试

一.设计测试用的数据库 1.新建数据库 create database testmysql; 2.新建一个用户信息数据表 create table test( username varchar(20) primary key, password varchar(20)); 3.给新表插入数据信息 insert into test values('keivn','123456'); 二. 设计局部数据源和连接池 1.在webapps目录中新建test目录,然后在test中分别新建WEB-INF和M