JDBC连接池的简单实现
首先解释一下,我在做自己android发育。java web这是我的弱点,就在最近,京东云免费,因此,要折腾几。有一点经验,特别是作为共享。
假设内容的文章是错,还请高手指正。
我在这里web结束,需要连接到数据库查询插入其他操作,就断开的话,未免效率太低。
曾经知道tomcat中能够配置,可是京东云引擎的tomcat并不能由自己配置。由于我折腾的东西较小。所以也不考虑使用框架。于是就想自己写一个。
我写的连接池非常easy,在初始化时创建5个连接,并放在一个列表其中。假设要获取连接,从列表中获取,同一时候列表移除,还回来时,列表加入上。
也就是列表保存的是闲置的连接。
假设列表已经为空了。那么推断是否超过最大连接了,没有就创建,有的话就等待。当然,我这里做的是非常easy的实现。所以没有去做等待超时等处理。
代码例如以下:
package com.githang.tucao.web.dbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList; public class DatabaseConnection {
private static final String CREATE_TABLE_TWITTER = "CREATE TABLE IF NOT EXISTS twitter (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, msg varchar(300) not null) DEFAULT CHARSET=utf8";
final static String HOST = "host";
final static String PORT = "port";
final static String DB_NAME = "dbname";
final static String USERNAME = "username";
final static String PASSWORD = "password";
final static String url = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DB_NAME
+ "?useUnicode=true&characterEncoding=utf-8";
private static final DatabaseConnection instance = new DatabaseConnection();
private final int INIT_COUNT = 5;
private final int MAX_COUNT = 30;
private int count = 0; private final Object wait = new Object(); private LinkedList<Connection> CONN_POOL; private DatabaseConnection() {
CONN_POOL = new LinkedList<Connection>();
try {
Class.forName("com.mysql.jdbc.Driver");
for (int i = 0; i < INIT_COUNT; i++) {
Connection connection = createConnection();
if(connection != null) {
CONN_POOL.add(createConnection());
count++;
}
}
// Connection connection = getConnection();
// Statement stmt = connection.createStatement();
// stmt.execute(CREATE_TABLE_TWITTER);
// stmt.execute("set names 'utf-8'");
// stmt.close();
// releaseConnection(connection);
} catch (Exception e) {
e.printStackTrace();
}
} public static DatabaseConnection getInstance() {
return instance;
} private static Connection createConnection() {
try {
return DriverManager.getConnection(url, USERNAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
} public Connection getConnection() {
synchronized (CONN_POOL) {
while(CONN_POOL.size() > 0) {
Connection conn = CONN_POOL.removeLast();
try {
if(conn.isValid(1000)) {
return conn;
} else {
count--;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
if(count < MAX_COUNT) {
count++;
return createConnection();
}
synchronized (wait) {
try {
wait.wait(3000);
if(CONN_POOL.size() > 0) {
return CONN_POOL.removeLast();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return null;
} public void releaseConnection(Connection connection) {
CONN_POOL.add(connection);
synchronized (wait) {
wait.notify();
}
} }
当中count用于保存当前连接数(包含闲置和在使用的)。
wait对象用于线程同步锁。主要是获取不到连接而且须要等其它连接被还回来时使用。在getConnection()里面调用 wait,而在releaseConnection()方法中。也就是释放连接时,调用 notify通知其它等待的线程。
另外,在公用的数据库其中。数据库连接一般是不作长连接的。
所以在这里连接池中的连接。可能是已经断开的或者是无效的,所以在在获取连接时必须得到推断有关当前连接仍然有效。如果没有赢。
版权声明:本文博主原创文章。博客,未经同意不得转载。
JDBC连接池的简单实现的更多相关文章
- 自定义一个简单的JDBC连接池
一.什么是JDBC连接池? 在传统的JDBC连接中,每次获得一个Connection连接都需要加载通过一些繁杂的代码去获取,例如以下代码: public static Connection getCo ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...
- jdbc连接池&改进dbUtil成C3P0Util
一.jdbc连接池 1.连接池的存在理由 前面介绍的dbUtils工具类虽然实现了一个对jdbc的简单封装.但它依旧采取从驱动管理获取连接 (DriverManager.getConnection ...
- Tomcat 的 JDBC 连接池
JDBC 连接池 org.apache.tomcat.jdbc.pool 是 Apache Commons DBCP 连接池的一种替换或备选方案. 那究竟为何需要一个新的连接池? 原因如下: Comm ...
- 数据层优化-jdbc连接池简述、druid简介
终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...
- 四大流行的jdbc连接池之C3P0篇
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...
- JDBC连接池-C池3P0连接
JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版 c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池 三种方 ...
- JDBC连接池(三)DBCP连接池
JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了 1.JDBC自定义连接池 2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包 (注意:mysql和mysql 驱动 ...
- JDBC连接池-自定义连接池
JDBC连接池 java JDBC连接中用到Connection 在每次对数据进行增删查改 都要 开启 .关闭 ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例 pack ...
随机推荐
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
- 自己动手写一个编译器Tiny语言解析器实现
然后,上一篇文章简介Tiny词法分析,实现语言.本文将介绍Tiny的语法分析器的实现. 1 Tiny语言的语法 下图是Tiny在BNF中的文法. 文法的定义能够看出.INNY语言有以下特点: 1 程序 ...
- Jvascript方法
Jvascript实用方法 这篇我主要记录一些在工作中常用的.实用的方法. String trim 字符串方法中的trim主要用来去空格使用,很多时候,在后台做参数处理的时候,我们都会使用该方法, ...
- IBatis.net初步使用
最近加班比较忙,时间也比较琐碎,蛮久没有写东西了.这次就总结一下自己使用IBatis.net的一些总结吧. IBatis简介 IBatis.net是一款开源的Orm框架,应该算是从java的IBati ...
- Attribute(两)——定义自己的特色+Asp.net MVC中间filter详细解释
部分博客是预先定义的有关特性的一些基本特征,同时还Attribute这一概念的一个宏观上的认识,在上篇博客结尾介绍了有关为自己定义特性服务的AttributeUsage,这篇博客主要是通过filter ...
- Linux在什么样的从脚本文件数据库sh格式改变sql格式
在软件开发过程中,经常参与Linux从下一个脚本文件数据库sh格式改变sql格式问题.在本文中,一个实际的脚本文件,例如.描述格式转换过程. 1. sh文件内容 本文中的文件名称为exa ...
- codeigniter 该脚本在运行300s超时退
直接看代码, file:system/core/CodeIgniter.php /* 102 * -------------------------------------------------- ...
- hadoop-HBase-observer的一个样例
hbase(main):021:0> describe 'users' DESCRIPTION ...
- Android组件系列----ContentProvider内容提供商【5】
2.执行query()方法,查询全部记录(眼下一共两条记录).后台输出效果例如以下: 经測试,其它方法也都是能够运行的. 事实证明,新建的另外一个project文件ContentResolverTes ...
- 移动端 像素渲染流水线与GPU Hack
什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...