package com.bjpowernode.jdbc._08连接池.service.impl;
import com.bjpowernode.jdbc._08连接池.domain.PoolConnection;
import com.bjpowernode.jdbc._08连接池.service.IPool;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Vector;
public class JdbcPool implements IPool {
//驱动
private static String jdbcDriver;
//连接地址
private static String jdbcUrl;
//数据库用户名
private static String username;
//数据库密码
private static String password;
//初始化连接数
private static Integer initConnectCount;
//最大连接数
private static Integer maxConnects;
//当连接不够时自动增长的数
private static Integer incrementCount;
//因为Vector是线程安全的,所有暂时选择它
private static Vector<PoolConnection> connections = new Vector<>();
/*
* 通过实例初始化块来初始化
*/
{
//读取对应的配置文件,加载入properties中,并设置到对应的参数中
InputStream is = JdbcPool.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
try {
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
jdbcDriver = properties.getProperty("jdbcDriver");
jdbcUrl = properties.getProperty("jdbcUrl");
username = properties.getProperty("username");
password = properties.getProperty("password");
initConnectCount = Integer.valueOf(properties.getProperty("initConnectCount"));
maxConnects = Integer.valueOf(properties.getProperty("maxConnects"));
incrementCount = Integer.valueOf(properties.getProperty("incrementCount"));
try {
/*
* 注册jdbc驱动
* */
Driver driver = (Driver) Class.forName(jdbcDriver).newInstance();
DriverManager.registerDriver(driver);
/*
* 根据initConnectCount来初始化连接池
* */
createConnections(initConnectCount);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 获取可用连接
*/
@Override
public PoolConnection getConnection() {
if (connections.isEmpty()) {
System.out.println("连接池中没有连接");
throw new RuntimeException("连接池中没有连接");
}
return getActiveConnection();
}
/**
* 同步方法来获取连接池中可用连接,在多线程情况下,只有一个线程访问该方法来获取连接,防止由于多线程情况下多个线程获取同一个连接从而引起出错
*/
private synchronized PoolConnection getActiveConnection() {
/*
* 通过循环来获取可用连接,若获取不到可用连接,则依靠无限循环来继续获取
* */
while (true) {
for (PoolConnection con : connections) {
if (!con.isUse()) {
Connection trueConn = con.getConn();
try {
//验证连接是否失效 0表示不校验超时
if (!trueConn.isValid(0)) {
con.setConn(DriverManager.getConnection(jdbcUrl, username, password));
}
} catch (SQLException e) {
e.printStackTrace();
}
con.setUse(true);
return con;
}
}
/*
* 根据连接池中连接数量从而判断是否增加对应的数量的连接
* */
if (connections.size() <= maxConnects - incrementCount) {
createConnections(incrementCount);
} else if (connections.size() < maxConnects && connections.size() > maxConnects - incrementCount) {
createConnections(maxConnects - connections.size());
}
}
}
/*
* 创建对应数量的连接并放入连接池中
* */
private void createConnections(int count) {
for (int i = 0; i < count; i++) {
if (maxConnects > 0 && connections.size() >= maxConnects) {
System.out.println("连接池中连接数量已经达到最大值");
throw new RuntimeException("连接池中连接数量已经达到最大值");
}
try {
Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
/*
* 将连接放入连接池中,并将状态设为可用
* */
connections.add(new PoolConnection(connection, false));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/*
* 获取连接池中连接数量
* */
public int getSize() {
return connections.size();
}
@Override
public Connection getConnectionNoPool() {
Connection connection = null;
try {
connection = DriverManager.getConnection(jdbcUrl, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
JDBC(powernode 文档)源代码 目录 JDBC概述 1.1 前言 1.2 什么是JDBC 1.3 JDBC的原理 1.4 程序员,JDBC,JDBC驱动的关系及说明 1.4.1 JDBC API 1.4.2 JDBC 驱动 1.4.3 Java程序员 1.4.4 三方关系 1.5 总结 2.JDBC操作数据库的步骤 2.1 总体步骤 2.2 详细步骤 2.2.1 官网下载驱动包 2.2.2 加载驱动 2.2.3 创建数据库连接 2.2.4 创建Statement并发送命令 2.2.5 处理ResultSet结果 2.2.6 关闭数据库资源 3.准备工作 3.1 创建数据库并创建student表 3.2 创建项目 3.3 创建lib目录并引入MYSQL驱动包 3.4 把lib包引入项目环境 4.使用JDBC完成添加操作 4.1 步骤 4.2 代码 4.3 URL详解 4.3.1 为什么要定义URL 4.4查看数据库 4.4.1 一个URL由哪些部分组成 5.使用JDBC完成更新和删除 5.1步骤 5.2 修改
资源推荐
资源详情
资源评论
收起资源包目录
JDBC(powernode 文档)源代码.zip (70个子文件)
JDBCNeatenDocument
lib
junit-4.13.2.jar 376KB
hamcrest-core-1.3.jar 44KB
mysql-connector-j-8.0.32.jar 2.37MB
resources
jdbc.properties 249B
src
com
bjpowernode
jdbc
_09BaseDAO的封装
dao
UserDao.java 716B
BaseDao.java 6KB
test
TestAPI.java 708B
_10分页的封装
PageInfo.java 489B
PageTest.java 567B
_04使用JDBC完成分页查询
Test05QueryForPage.java 2KB
_06事务处理解决转账问题
Test08Transaction.java 1KB
_02DBUtils的简单封装
DBUtils.java 2KB
Test01Add.java 947B
javabean
SysUser.java 2KB
Student.java 2KB
_01基本的CRUD
使用JDBC完成更新操作
Test02Update.java 1KB
使用JDBC完成删除操作
Test03Delete.java 2KB
使用JDBC完成添加操作
Test01Add.java 2KB
util
DBUtils.java 2KB
_08连接池
service
IPool.java 394B
impl
JdbcPool.java 6KB
PoolManager.java 396B
test
JdbcNoPoolMain.java 3KB
domain
PoolConnection.java 948B
_07JDBC批处理
Test09Batch.java 2KB
_05SQL注入问题
编写代码实现登录
SysUser.java 2KB
问题引入
Test06Login.java 2KB
解决办法
Test07Login.java 2KB
_03使用JDBC完成查询
循环向student表里面插入20条数
Test04Query02.java 1KB
Student.java 2KB
Test01Add20.java 1KB
Test04Query.java 1KB
out
production
JDBCNeatenDocument
jdbc.properties 249B
com
bjpowernode
jdbc
_09BaseDAO的封装
dao
UserDao.class 2KB
BaseDao.class 6KB
test
TestAPI.class 1KB
_10分页的封装
PageTest.class 1KB
PageInfo.class 1KB
_04使用JDBC完成分页查询
Test05QueryForPage.class 2KB
_06事务处理解决转账问题
Test08Transaction.class 2KB
_02DBUtils的简单封装
Test01Add.class 1KB
DBUtils.class 2KB
javabean
Student.class 2KB
SysUser.class 2KB
_01基本的CRUD
使用JDBC完成更新操作
Test02Update.class 2KB
使用JDBC完成删除操作
Test03Delete.class 2KB
使用JDBC完成添加操作
Test01Add.class 2KB
util
DBUtils.class 2KB
_08连接池
PoolManager.class 573B
service
IPool.class 275B
impl
JdbcPool.class 5KB
test
JdbcNoPoolMain$1.class 1KB
JdbcNoPoolMain.class 3KB
PoolManager$CreatePool.class 771B
domain
PoolConnection.class 965B
_07JDBC批处理
Test09Batch.class 3KB
_05SQL注入问题
编写代码实现登录
问题引入
Test06Login.class 3KB
SysUser.class 2KB
解决办法
Test07Login.class 3KB
_03使用JDBC完成查询
循环向student表里面插入20条数
Test04Query.class 2KB
Student.class 2KB
Test04Query02.class 2KB
Test01Add20.class 2KB
.idea
uiDesigner.xml 9KB
libraries
hamcrest_core_1_3.xml 297B
workspace.xml 9KB
misc.xml 278B
modules.xml 283B
.gitignore 184B
JDBCNeatenDocument.iml 910B
共 70 条
- 1
资源评论
FBIHackerHarry浩
- 粉丝: 3w+
- 资源: 60
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功