[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
如果不采用连接池技术, 将导致不断创建和销毁数据库Connection, 造成性能上的损耗. 而数据库连接池技术将在池中创建一定数量的Connection, 当需要Connection时就从池中取出一个, 用完之后归还给连接池, 而不是将其销毁.
自定义数据库连接池的具体步骤分析:
a. 定义MyDataSource类, 实现DataSource接口, 并提供接口中定义的方法. 其中, 核心方法为Connection getConnection().
b. 可以在静态代码块或构造函数中创建多个Connection对象, 并将他们存储在LinkedList中. 当调用MyDataSource对象的getConnection()方法时, 从集合中取出一个Connection返回给调用者. 当调用者使用完Connection并调用Connection对象的close()方法时, 将该Connection对象归还给连接池.
c. 调用Connection对象的close()方法时, 为阻止系统销毁该连接, 而改为将连接归还给连接池, 可以采用包装设计模式. 此时包装的目标类为Connection, 因此需要定义MyConnection类并实现Connection接口. MyConnection类应该存在2个成员: Connection对象和LinkedList<Connection>对象, 这2个成员可以通过构造函数存入. 同时需要覆写close()方法, 在close()方法中实现将Connection添加到集合中.
代码如下:
public class MyDataSource implements DataSource {
// 存储Connection对象的集合, 该集合最好采用LinkedList实现, 因为涉及到大量的删除和添加操作.
private List<Connection> conns = new LinkedList<Connection>();
public MyDataSource(String propertiesFileName) throws IOException,
ClassNotFoundException, SQLException {
// 连接池中Connection对象的数量
int initialSize = 10;
// 根据配置文件的名称获得InputStream对象
InputStream in = MyDataSource.class.getClassLoader()
.getResourceAsStream(propertiesFileName);
// 使用Properties读取配置文件
Properties prop = new Properties();
prop.load(in);
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String password = prop.getProperty("password");
String driver = prop.getProperty("driver");
// 加载数据库驱动
Class.forName(driver);
// 根据配置文件中的信息获取数据库连接
for (int i = 0; i < initialSize; i++) {
Connection conn = DriverManager.getConnection(url, user, password);
conns.add(conn);
}
}
@Override
public Connection getConnection() throws SQLException {
// 获取从集合中移除的Connection对象, 并将其包装为MyConnection对象后返回.
Connection conn = conns.remove(0);
// 测试代码
System.out.println("获取连接之后, 连接池中的Connection对象的数量为: " + conns.size());
return new MyConnection(conn, conns);
}
private class MyConnection implements Connection {
private Connection conn;
private List<Connection> conns;
public MyConnection(Connection conn, List<Connection> conns) {
this.conn = conn;
this.conns = conns;
}
// 重写close()方法, 实现调用该方法时将连接归还给连接池
@Override
public void close() throws SQLException {
conns.add(conn);
// 测试代码
System.out.println("将连接归还给连接池后, 连接池中的Connection对象的数量为: " + conns.size());
}
// 对于其他方法, 直接调用conn对象的相应方法即可
@Override
public void clearWarnings() throws SQLException {
conn.clearWarnings();
}
@Override
public void commit() throws SQLException {
conn.commit();
}
// 省略了其余Connection接口中定义的方法...
}
// 省略了其他DataSource接口中定义的方法...
}
以下是测试代码:
// create table person(id int primary key auto_increment, name varchar(40), age int);
public class JDBCPool {
@Test
public void myDataSourceTest() {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
MyDataSource pool = new MyDataSource("db.properties");
conn = pool.getConnection();
String sql = "insert into person(name, age) values('min', 22)";
st = conn.prepareStatement(sql);
st.executeUpdate();
sql = "select * from person";
st = conn.prepareStatement(sql);
rs = st.executeQuery();
if (rs.next()) {
System.out.println("id = " + rs.getInt("id") + ", name = "
+ rs.getString("name") + ", age = " + rs.getInt("age"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 在release方法内会调用conn对象的close()方法
release(null, st, conn);
}
}
// 释放资源
public void release(ResultSet rs, Statement st, Connection conn) {
try {
if (rs != null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
rs = null;
} finally {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
st = null;
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
conn = null;
}
}
}
}
}
程序的输出为:
获取连接之后, 连接池中的Connection对象的数量为: 9
id = 6, name = min, age = 22
id = 7, name = coolxing, age = 24
将连接归还给连接池后, 连接池中的Connection对象的数量为: 10
可见这个自定义的连接池是可以工作的.
自定义数据库连接池只是为了学习JDBC连接池的原理, 平时项目使用的时候, 还是应该以开源的数据库连接池为主.
常用的数据库连接池为DBCP, C3P0, 以及TOMCAT内置的连接池. 下面简单的介绍以下前两者的使用.
1. DBCP连接池使用步骤:
a. 导入Commons-dbcp.jar和Commons-pool.jar到project中.
b. 获取数据源DataSource对象. 可以直接创建BasicDataSource对象后调用相应的set方法, 如:
DataSource pool = new BasicDataSource();
pool.setUrl("jdbc:mysql://localhost:3306/exercise");
pool.setUsername("root");
pool.setPassword("root");
pool.setDriverClassName("com.mysql.jdbc.Driver");
pool.setInitialSize(10);
也可以通过工厂类加载配置文件获得DataSource对象, 如:
Properties prop = new Properties();
InputStream in = JDBCPool.class.getClassLoader().getResourceAsStream("dbcp.properties");
prop.load(in);
DataSource pool = BasicDataSourceFactory.createDataSource(prop);
c. 调用DataSource对象的getConnection()方法获得连接.
2. C3P0连接池的使用步骤:
a. 导入c3p0-0.9.1.2.jar和c3p0-0.9.1.2-jdk1.3.jar.
b. 获取数据源DataSource对象. 可以直接创建ComboPooledDataSource对象后调用相应的set方法, 如:
ComboPooledDataSource pool = new ComboPooledDataSource();
pool.setJdbcUrl("jdbc:mysql://localhost:3306/exercise");
pool.setUser("root");
pool.setPassword("root");
pool.setDriverClass("com.mysql.jdbc.Driver");
pool.setInitialPoolSize(10);
也可以在创建ComboPooledDataSource对象时传入配置节点的名称, 此时需要存在c3p0-config.xml文件. 如:
// 创建连接池, 并从c3p0-config.xml文件中的name属性为mysql的named-config元素中读取参数
ComboPooledDataSource pool = new ComboPooledDataSource("mysql");
c. 调用DataSource对象的getConnection()方法获得连接.
分享到:
相关推荐
自定义的JDBC连接池,支持并发访问,可维持多个数据库的连接池
下面小编就为大家分享一篇自定义一个简单的JDBC连接池实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
自己写的连接池如果想知道连接池是怎么实现的就动手下载吧!
在学习了JDBC后,想着传这个自定义连接池的代码,方便大家的学习与交流,有什么不懂或者指导的请联系我,谢谢
自定义数据连接池 4.开源数据库连接池(第三方企业中使用的连接池) 4.1.DBCP数据源 4.2.C3P0连接池 4.3.Druid连接池 4.3.1.druid连接池的使用 1.应用程序直接获取数据库连接的缺点 用户每次请求都需要...
主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
JDBC连接池&DBUtils。使用连接池改造JDBC的工具类:。传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序. * 在程序开始的时候,可以创建几个连接,将连接放入...
文章目录1 JDBC1.1 使用JDBC的基本步骤1.2 JDBC工具类构建1.3 数据库的CRUD1.4 Dao模式1.5 Statement安全问题1.6 PrepareStatement2 数据库连接池2.1 自定义数据库连接池2.2 解决自定义数据库连接池出现的问题。...
自定义 jdbc 模板包含 jdbc 查询、更新、数据库连接池和连接代理。
数据库连接池的概念,自定义数据库连接池,开源数据库连接池,自定义JDBC框架, DataSource 接口,归还数据库连接的方式,继承,装饰设计模式,适配器设计模式,动态代理
第一章 自定义连接池使用JDBC操作数据库,需要建立Connection,使用传统的JDBC操作需要每次创建Connection,创建Connection是一个
red5连接池配置: 1,解压jar到项目:WEB-INF\lib目录下 commons-dbcp-1.2.1.jar json-lib-2.4-jdk15.jar mysql-connector-java-5.1.9.jar spring-dao.jar spring-jdbc.jar 2,修改项目目录下的:red5-web....
Midao JDBC 简化了 JDBC 的开发,特点是灵活、可定制、简单直观,提供大量的功能,包括事务处理、元数据操作、类型处理、检视、输入输出处理和转化,带连接池的数据源支持;缓存和懒查询执行;命名参数;多供应商...
面向对象:封装、继承、多态 Java基础:变量、数据类型、运算符、...数据库操作:JDBC、ORM框架、连接池等 常用的框架:Spring、SpringMVC、MyBatis、Hibernate等 分布式相关技术:Dubbo、Zookeeper、Redis、RocketMQ等
javaweb dbutil c3p0 自定义数据库连接池 连接数mysql据库 ,eclipse项目代码
db.jdbc:jdbc连接池 game:开始游戏 game.message:消息管理者,将客户端的消息传到具体的处理器处理 game.message.handler:消息处理者(功能实现的地方,上接service,下连DAO) net.mina.protocol:自定义通信...
框架开发学习 此仓库给出了在框架开发中经常使用的不同Java概念和编程技术的示例。...一个简单的连接池: Java JUC 完毕 Java CAS java-cas 完毕 Java SPI java-spi JDBC 完毕 Java零拷贝 Java零复制
一个已经封装了连接池(可以自定义连接池大小)的jdbc工具类,代码简单清晰,适合java初学者,以便更好更快的熟悉数据库操作。
配置连接池11.热部署12.身份认证,整合Apache Shiro和自定义拦截器两种方式13.发送邮件14.消息队列,集成RabbitMQ15.生成token 集成jwt1后台gradle构建,2springboot,3,系统架构,4.模板引擎---thymeleaf或者json...