- 浏览: 599752 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
如果不采用连接池技术,将导致不断创建和销毁数据库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添加到集合中.
代码如下:
以下是测试代码:
程序的输出为:
获取连接之后, 连接池中的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()方法获得连接。
转自:http://coolxing.iteye.com/blog/1258983
自定义数据库连接池的具体步骤分析:
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()方法获得连接。
转自:http://coolxing.iteye.com/blog/1258983
发表评论
文章已被作者锁定,不允许评论。
-
java WeakHashMap学习(key是弱引用)
2018-06-21 09:31 1232在Java集合中有一种特殊的Map类型:WeakHashMap ... -
java HashMap TreeMap(key顺序) LinkedHashMap(插入顺序)学习
2018-06-07 10:27 953java为数据结构中的映射定义了一个接口java.util.M ... -
java RESTful 详解
2018-04-27 11:35 643(1)每一个URI代表一种资源,独一无二; (2)客户端 ... -
java 通过HttpsUrlConnection访问接口数据
2018-04-19 11:25 990server: ssl: key-stor ... -
java 使用多线程的场景总结
2018-04-10 14:35 1704在一个高并发的网站中,多线程是必不可少的。下面先说一下多线程在 ... -
java Enum枚举设置
2018-04-10 10:55 480/** * 数据状态:0:无效,1:有效 **/ ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1621REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
java FYOpenApi实现短信发送
2018-01-02 17:10 11741.配置文件 sms.OpenUrl = http://s ... -
java JSONObject序列化包含Date类型数据的Java对象
2017-12-26 16:31 1617如果Date.class无法进行转换则使用Timestamp. ... -
java 用HttpsURLConnection进行传递中文时错误总结
2017-12-07 16:42 654传递中文时需要用Writer而不是OutputStream ... -
java 内存泄漏
2017-11-27 13:51 4951.内存溢出 out of memory ... -
ActiveMQ 三种发送消息方式(同步,异步,单向)
2017-11-17 10:25 2453MQ 发送普通消息有三种实现方式:可靠同步发送、可靠异步发送、 ... -
java Guava ListenableFuture实现线程回调功能
2017-11-14 10:17 1775java Future具有局限性。在实际应用中,当需要下 ... -
java Curator实现分布式锁
2017-09-05 14:39 1090Curator实现分布式锁主要依赖于zookeeper ... -
java Guava工具集学习(强大)
2017-09-05 10:28 432import java.util.Iterator ... -
java CyclicBarrier进行并发编程
2017-08-25 15:44 673CyclicBarrier允许一组线程相互等待达到一个公共的障 ... -
java 几种性能优化的总结
2017-08-23 14:08 3251、使用StringBuilder 一般 ... -
java 使用kyro进行高性能序列化对象和集合
2017-08-23 14:05 2152import java.io.ByteArrayInp ... -
java 对重复电话号码进行排除的优化(排序和前后对比)
2017-08-22 14:14 7911.先对10万数据排序; 2.对比前后两条数据 ; 3.筛 ... -
ActiveMQ 结合Spring进行数据同步
2017-07-19 15:27 584注意事项hibernate配置文件必须设置自动提交否则不能插入 ...
相关推荐
总之,这个简单的jdbc连接池类实现了基础的数据库连接管理,对于学习数据库连接池的工作原理和编写自己的连接池实现非常有帮助。虽然它的功能可能不如商业级连接池强大,但对于小型项目或教学示例来说,已经足够实用...
描述中提到的"jdbc连接池设计",意味着这个压缩包可能包含了一个简单的JDBC连接池实现或者相关的示例代码。其中,`jdom.jar`是一个Java文档对象模型库,主要用于解析XML文档。在数据库连接池的场景中,`jdom.jar`...
通过学习"完美的java jdbc连接池实例.zip"中的内容,开发者可以了解到如何在实际项目中配置和使用这些连接池,从而优化数据库操作的性能。此外,了解各种连接池的特性有助于选择最适合项目需求的连接池实现。例如,...
这是我写的一个对JDBC连接池的实现,高手见了可不要笑啊!!!! 程序是在linux下用Eclipse下编写的. 用Jude进行建模,数据库使用了mysql. 程序自带了MySql的Connection连接驱动类,你也可以使用别的驱动类和数据库, 在src/...
线程安全的JDBC连接池就是为此目的设计的一种优化手段。在这个简单的实现中,我们利用了`ConcurrentLinkedQueue`数据结构来确保多线程环境下的安全性和效率。 首先,让我们了解什么是JDBC连接池。JDBC连接池(Java ...
**JDBC连接池C3P0详解** JDBC(Java Database Connectivity)是Java语言与数据库交互的标准接口,但在实际应用中,频繁地创建和关闭数据库连接会导致资源浪费和性能下降。为了解决这个问题,引入了数据库连接池技术...
标题中的“一款小型JDBC连接池组件”指的是一个轻量级的数据库连接管理工具,它优化了数据库资源的分配和管理,提高了应用的性能。在Java应用开发中,JDBC连接池是必不可少的部分,它能有效地减少数据库的连接创建和...
总之,HikariCP v4.0.3作为一款高效的JDBC连接池,其内在的设计理念和实现策略值得我们深入学习和研究。通过理解并合理使用HikariCP,开发者可以提升应用的数据库操作性能,为用户提供更流畅的体验。
本资料包"spring声明式事务管理+jdbc+连接池.zip"显然是针对Spring框架在数据库操作方面的深入学习,特别是如何利用Spring进行声明式事务管理和JDBC操作,以及如何配置和使用数据库连接池。接下来,我们将详细探讨这...
开发者可以学习如何在Struts框架下实现业务逻辑,以及如何利用JDBC连接池进行数据库操作。同时,通过对`.sql`文件的分析,可以了解应用程序的数据模型和存储策略。这样的实例对于Java Web开发者来说,是一份宝贵的...
- **C3P0**:一个开源的JDBC连接池,提供了强大的异常处理和性能监控。 - **DBCP**:Apache提供的数据库连接池,基于Jakarta-pool实现。 - **HikariCP**:目前性能最佳的连接池,设计目标是速度、简单性和零内存...
然而,频繁地创建和关闭JDBC连接会带来额外的开销,因此引入了数据库连接池。 **单例模式:** 在本资源中,数据库连接池实现采用了单例模式。单例模式确保一个类只有一个实例,并提供一个全局访问点。在数据库连接...
通过这个简单的JDBC数据库连接池实现,我们可以学习到数据库连接池的基本原理和操作方式。然而,在实际生产环境中,我们通常会使用成熟的连接池实现,如Apache的DBCP、C3P0或HikariCP,它们提供了更高级的功能和更好...
本压缩包包含三个重要的JAR文件,分别是用于数据库连接池的Druid、Oracle数据库驱动ojdbc1.6以及代码简化工具Lombok,这些都是Java开发中常见的组件。 首先,让我们深入了解一下Druid。Druid是一个高效的数据库连接...
数据源与连接池是Java应用程序在处理数据库交互时的关键组件,它们提高了性能并优化了资源管理。在JDBC(Java Database Connectivity)2.0版本中引入了数据源的概念,为数据库连接的创建、管理和回收提供了更为高效...
** BoneCP 连接池学习笔记 ** BoneCP 是一个高效、轻量级的 Java 数据库连接池(JDBC Connection Pool)实现。它在性能上优于其他同类连接池,如 C3P0 和 DBCP,尤其适用于高并发场景。在深入理解 BoneCP 之前,...
这篇“连接池学习笔记”涵盖了关于连接池的基本概念、工作原理以及常见的数据库连接池实现,旨在帮助读者深入理解这一工具。以下是对该主题的详细阐述: 一、连接池的概念 连接池是一种对象池设计模式的具体应用,...
在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的标准接口。它允许Java应用程序通过发送SQL语句来...在实际开发中,合理使用JDBC连接池如HikariCP、C3P0等还能提高性能和资源管理效率。
Java JDBC 连接池大礼包包含了对数据库进行高效管理的必要知识,主要涉及Java数据库连接(JDBC)以及连接池的概念和技术。JDBC是Java语言访问数据库的标准接口,而连接池则是优化数据库操作的一种策略,它能提高应用...