- 浏览: 470940 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (135)
- javascript (43)
- struts (3)
- webWork (0)
- hibernate (2)
- EJB (0)
- Spring (2)
- XML (2)
- Oracle (4)
- Mysql (0)
- C (0)
- C++ (0)
- 网络 (0)
- linux (4)
- java (28)
- 设计模式 (0)
- java 代理模式 (2)
- jsp&Servlet (2)
- Tomcat (5)
- 算法设计 (2)
- 操作技巧 (1)
- HTML (5)
- Ajax (2)
- JScript Deviations from ES3 (14)
- Eclipse (1)
- log4J (2)
- ant (1)
- HTTP (4)
- project (1)
- SqlServer (4)
- 数据仓库 (0)
最新评论
-
u012526168:
header的域名是大小写敏感的.http://stackov ...
HTTP 请求报头详解 -
junes_yu:
这样的方法有问题哦正确方法如下:document.onkeyd ...
javascript 屏蔽F5,BackSpace,IE的刷新,右键功能 -
xunke515:
第二个,如果要带顺序的话,new个treeset也可以吧.
两种方法删除ArrayList里重复元素 -
bangyulin:
java 潜拷贝和深拷贝 -
hecongqi:
谢谢,写得很好,学到知识了
浅谈Java代理机制
对于数据库数据不停的读取和更改,频繁的建立Connection是很不划算,建立连接池是很好的选择,在多个数据库数据之间来回倒换,需要为每个数据库建立一个池,本例的目的就是建立一个管理这些池的管理类,达到的目的是:在我们需要一个链接的时候,只要提供需要那个连接池(每个连接池对于一个名字,所有的连接池都装载入一个Map中)的名字,就可以得到链接进行操作,完毕需要关闭,关闭这个链接并不会真正的关闭,在池中他还是存在的。
首先定义个xml文件作为我们需要的连接池的配置文件:如下:config.xml
作为对象操作,这个xml有相对应的Bean:如下:
BaseConnBean.java
还需要一个操作就是吧xml文件组装成Bean,并把这些bean加到list里面,代码如下
ConfigXml.java
最后,最关键的类就是管理类了,(需要增加dbcp的jar包,同时还需要commons-pools)代码如下
至此,基本工作已经完成,需要链接,只要MyDbPool.getDbConnection("name1"),就可以得到一个链接,注意,用完需要归还下
多线程测试例子
首先定义个xml文件作为我们需要的连接池的配置文件:如下:config.xml
<?xml version="1.0" encoding="UTF-8"?> <pools> <pool> <!-- 连接池的名字 --> <name>one</name> <!-- 连接数据库的名字 --> <username>name1</username> <!-- 连接数据库的密码 --> <password>pswd1</password> <!-- 连接数据库的url --> <jdbcurl>jdbc:mysql://IP/DataminInfo</jdbcurl> <!-- 连接池的最大容纳链接数目 --> <max>10</max> <!-- 连接池取不到链接等待时间 --> <wait></wait> <!-- 连接数据库驱动 --> <driver>com.mysql.jdbc.Driver</driver> </pool> <pool> <name>two</name> <username>name2</username> <password>paswd2</password> <jdbcurl>jdbc:mysql://IP/UIC</jdbcurl> <max>10</max> <wait></wait> <driver>com.mysql.jdbc.Driver</driver> </pool> </pools>
作为对象操作,这个xml有相对应的Bean:如下:
BaseConnBean.java
public class BaseConnBean { private String name; private String username; private String password; private String jdbcurl; private int max; private long wait; private String driver; public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; } ……//其他set get方法 }
还需要一个操作就是吧xml文件组装成Bean,并把这些bean加到list里面,代码如下
ConfigXml.java
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import com.cgogo.mymodel.po.BaseConnBean; public class ConfigXml { public static void main(String[] args) { read("config.xml"); } public static List<BaseConnBean> read(){ return read("config.xml"); } public static List<BaseConnBean> read(String path) { String rpath = ConfigXml.class.getResource("").getPath().substring(1) + path; FileInputStream fi = null; List<BaseConnBean> pools=new ArrayList<BaseConnBean>(); try { fi = new FileInputStream(rpath); SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(fi); Element root = doc.getRootElement(); List list=root.getChildren(); Element pool = null; Iterator allPool = list.iterator(); while(allPool.hasNext()){ pool=(Element) allPool.next(); BaseConnBean bcBean=new BaseConnBean(); bcBean.setName(pool.getChildText("name")); bcBean.setUsername(pool.getChildText("username")); bcBean.setPassword(pool.getChildText("password")); bcBean.setJdbcurl(pool.getChildText("jdbcurl")); try{ bcBean.setMax(Integer.parseInt(pool.getChildText("max"))); }catch(NumberFormatException e){ bcBean.setMax(0); } try{ bcBean.setWait(Long.parseLong(pool.getChildText("wait"))); }catch(NumberFormatException e){ bcBean.setWait(-1L); } bcBean.setDriver(pool.getChildText("driver")); pools.add(bcBean); } } catch (FileNotFoundException e) { System.out.println("file does not find"); e.printStackTrace(); } catch (JDOMException e) { System.out.println("jdom exception"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return pools; } }
最后,最关键的类就是管理类了,(需要增加dbcp的jar包,同时还需要commons-pools)代码如下
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.DriverManagerConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDriver; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; import com.cgogo.mymodel.po.BaseConnBean; import com.cgogo.mymodel.util.ConfigXml; public class MyDbPool { public static void main(String[] args) { } private static String dbJdbc = null; private static String dbUser = null; private static String dbPwd = null; private static int max; private static long wait; private static String driver = null; private static Class driverClass = null; private static ObjectPool connectionPool = null; public static Map<String, ObjectPool> map = null; public MyDbPool() { } /** *//** * 初始化数据源 */ private static synchronized void initDataSource() { // 驱动数据源 if (driverClass == null) { try { driverClass = Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } /** *//** * 连接池启动 * * @throws Exception */ public static void StartPool(String poolname, String dbJdbc, String dbUser, String dbPwd, int max, long wait) { // 初始化数据源 initDataSource(); // 如果连接池为空 if (connectionPool != null) { ShutdownPool(); } try { connectionPool = new GenericObjectPool(null, max, (byte) 1, wait); ConnectionFactory connectionFactory = new DriverManagerConnectionFactory( dbJdbc, dbUser, dbPwd); PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory( connectionFactory, connectionPool, null, null, false, true); Class.forName("org.apache.commons.dbcp.PoolingDriver"); PoolingDriver driver = (PoolingDriver) DriverManager .getDriver("jdbc:apache:commons:dbcp:"); driver.registerPool(poolname, connectionPool); map.put(poolname, connectionPool); System.out.println("Create " + poolname + " for Database Connection Succees."); } catch (Exception e) { e.printStackTrace(); } } /** *//** * 释放连接池 */ public static void ShutdownPool() { try { PoolingDriver driver = (PoolingDriver) DriverManager .getDriver("jdbc:apache:commons:dbcp:"); driver.closePool("dbpool"); } catch (SQLException e) { e.printStackTrace(); } } /** *//** * 打印连接池状态 */ public static String GetPoolStats(String poolname) { StringBuffer stat = new StringBuffer(); try { PoolingDriver driver = (PoolingDriver) DriverManager .getDriver("jdbc:apache:commons:dbcp:"); ObjectPool connectionPool = driver.getConnectionPool(poolname); stat.append("-- Active Connection: "); stat.append(connectionPool.getNumActive()); stat.append(" ,"); stat.append("Free Connection: "); stat.append(connectionPool.getNumIdle()); stat.append(" . --"); } catch (Exception e) { e.printStackTrace(); } return stat.toString(); } /** *//** * 取得连接池中的连接 * * @return */ public synchronized static Connection getDbConnection(String poolname) { Connection conn = null; if (map == null) { System.out.println("map null"); map = new HashMap<String, ObjectPool>(); } if (map.get(poolname) == null) { init(poolname);// 初始化基本数据 StartPool(poolname, dbJdbc, dbUser, dbPwd, max, wait); } try { conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:" + poolname); } catch (SQLException e) { e.printStackTrace(); } return conn; } private static void init(String poolname) { List<BaseConnBean> pools = ConfigXml.read(); for (BaseConnBean baseConnBean : pools) { if (baseConnBean.getName().equals(poolname)) { dbJdbc = baseConnBean.getJdbcurl(); dbUser = baseConnBean.getUsername(); dbPwd = baseConnBean.getPassword(); max = baseConnBean.getMax(); wait = baseConnBean.getWait(); driver = baseConnBean.getDriver(); } } } public static void close(Connection c) { try { if (c != null) c.close(); } catch (SQLException e) { e.printStackTrace(); } } }
至此,基本工作已经完成,需要链接,只要MyDbPool.getDbConnection("name1"),就可以得到一个链接,注意,用完需要归还下
多线程测试例子
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; public class Test1 extends Thread{ private String sql; private String poolname; private Connection c; public Test1(String poolname,Connection c,String sql){ this.poolname=poolname; this.c=c; this.sql=sql; } public static void main(String[] args) { for(int i=0;i<100;i++){ String sql="select * from table1 limit "+i+",1"; new Test1("datamininfo",MyDbPool.getDbConnection("datamininfo"),sql).start(); sql="select * from table2 limit "+i+",1"; new Test1("uic",MyDbPool.getDbConnection("uic"),sql).start(); } } public void run(){ try { ResultSet rs=c.createStatement().executeQuery(sql); while(rs.next()){ System.out.println(rs.getString(1)); } if(poolname.equals("datamininfo")) System.out.println("DataMinInfo:\n"+MyDbPool.GetPoolStats("name1")); else System.out.println("UIC:\n"+MyDbPool.GetPoolStats("name2")); } catch (SQLException e) { e.printStackTrace(); }finally{ MyDbPool.close(c); } } }
评论
10 楼
knzl2002
2008-08-03
嗯,学习学习
9 楼
sunsong
2008-07-13
dbcp是不太稳定,c3p0总体反应好一点,而且参数更多,可配置性更强。
8 楼
zojomotico
2008-07-13
恩 学习到了
7 楼
soleghost
2008-07-12
曾经做一个项目的时候,dbcp的数据库的连接池经常断掉,不知道什么原因
后来用c3p0就没事了
后来用c3p0就没事了
6 楼
zingers
2008-07-12
C3P0。。
5 楼
jwin
2008-07-12
可以参考spring的AbstractRoutingDataSource,可以多态切换数据库
4 楼
kuangbaoxu
2008-06-29
3楼的好建议,我没有考虑这一点.多谢
3 楼
cddcdd
2008-06-25
找夏新的hibernate的书看一下
我看你好像没有关闭连接的处理
这个时候该请出动态代理出来了
我看你好像没有关闭连接的处理
这个时候该请出动态代理出来了
2 楼
SeanHe
2008-06-25
dbcp都实现好的东西,为什么要自己去实现一边呢?
1 楼
AllenZhang
2008-06-25
close的时候,直接把connection关了?
那不是池很快就干了?
那不是池很快就干了?
发表评论
-
Java 生成可执行exe
2011-01-06 09:18 2655第一步:完成Java GUI程序 在Eclipse下, ... -
java bean copy 反射实现代码
2008-10-20 17:09 2266import java.lang.reflect.*; ... -
ISO 8859 语言字符集详解
2008-10-07 14:14 2944ISO/IEC 8859-1,又称Latin-1 ... -
Unsupported major.minor version
2008-07-22 13:40 2536当你在编译Java时,遇到Unsupported major. ... -
两种方法删除ArrayList里重复元素
2008-07-10 16:00 172261.方法一: /** List order not mai ... -
java compileClassLoader
2008-07-01 21:15 1010import java.io.*; /* A Co ... -
java runtime.exec() 的讲解(转贴)
2008-07-01 20:59 14055那就首先说点Runtime类吧,他是一个与JVM运行时环境有关 ... -
JDK5.0以上版本的特殊用途(转贴)
2008-07-01 16:29 1433jinfo:可以输出并修改运 ... -
提高java程序性能 (转贴)
2008-07-01 16:00 1473下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAV ... -
Java 中生成数字证书(转贴)
2008-07-01 15:52 28931、创建证书 Java 中的 ... -
java虚拟机参数2 (转贴)
2008-06-29 17:22 1606JVM配置参数中文说明: ------------------ ... -
java虚拟机参数1 (转贴)
2008-06-27 17:14 1262下面的讨论以Windows平台的Sun MicroSystem ... -
java 生成excel
2008-06-24 17:16 8704java 生成excel 示例代码 //** *** ... -
java 陷阱 3 最后的笑声
2008-06-20 21:28 1227下面的程序打印的内容? Java代码 public cla ... -
java 陷阱2 动物状元
2008-06-20 21:27 939Java代码 下面的java ... -
java 陷阱 1 增量
2008-06-20 21:25 1231下面的程序对一个变量重复的进行增量操作,然后打印它的值,那么打 ... -
classloader 总结
2008-06-20 20:59 1611classloader对我来说一直都是很神秘的东东,这两天一直 ... -
classloader 热部署
2008-06-20 20:56 4310关键字: classloader 热部署 这两天一直在学习一 ... -
CompilingClassLoader
2008-06-20 20:54 1121import java.io.*; /* ... -
java 动态加载
2008-06-20 20:51 1925package com.cxz.thinking.act10; ...
相关推荐
DBCP数据库连接池的引入,使得应用程序可以预先创建并维护一定数量的数据库连接,当需要与数据库通信时,从连接池中获取一个已存在的连接,用完后不是立即关闭,而是将其归还回连接池,供后续使用。这样减少了频繁的...
**数据库连接池(DBCP)** 是一个在Java应用程序中管理数据库连接的工具,它能够有效地提高数据库操作的性能和效率。DBCP全称为`Jakarta Commons DBCP`,是Apache软件基金会的一个项目,提供了对数据库连接的池化...
根据描述中的信息,"dbcp数据库连接池jar包"应该包含了DBCP所需的库文件。通常,这包括`commons-dbcp-x.x.x.jar`和`commons-pool-x.x.x.jar`,它们分别是DBCP的核心库和对象池组件。确保这些jar包已经添加到你的项目...
"DBCP数据库连接池jar包.zip"这个压缩包包含以下文件: 1. `commons-dbcp2-2.6.0-bin`:这是DBCP2的二进制发行版,包含了编译后的jar文件,可以直接在项目中引用,用于实现数据库连接池的功能。 2. `commons-pool2-...
NULL 博文链接:https://xiongjiajia.iteye.com/blog/1295094
2. `commons-dbcp-1.4.jar`: 这就是DBCP的主要库文件,包含了数据库连接池的实现。它提供了BasicDataSource类,这是一个符合JDBC DataSource接口的数据源,可以配置连接池的各种参数,如最大连接数、最小连接数、...
使用DBCP数据库连接池,你需要在你的Java项目中引入这三个JAR文件,并进行相应的配置。以下是一些基本配置步骤: 1. 将这三个JAR文件添加到项目的类路径中。 2. 创建一个XML配置文件(如`dbcp-config.xml`),定义...
在上述内容中,主要展示了如何配置和使用DBCP数据库连接池。首先,配置文件`config.xml`定义了两个不同的数据库连接池,每个池都有自己的名称、用户名、密码、数据库URL、最大连接数和等待时间。例如,`one`连接池...
在本文档中,DBCP数据库连接池的配置和使用方法被详细介绍。首先,我们需要一个配置文件(如config.xml),用于定义不同的数据库连接池。在这个XML文件中,每个`<pool>`元素代表一个连接池,包含了如下关键属性: 1...
本篇将详细介绍DBCP数据库连接池的原理和配置。 数据库连接池的基本概念是在应用程序启动时预先创建一定数量的数据库连接,存储在一个池中,当需要与数据库交互时,应用程序可以从池中获取一个已存在的连接,而不是...
使用DBCP数据库连接池的主要步骤包括: 1. 引入DBCP的依赖库。 2. 配置数据库连接池参数,通常通过XML文件或在Java代码中直接设置。 3. 初始化连接池,创建`BasicDataSource`对象,并根据配置设置其属性,如最大...
DBCP(Database Connection Pool)是Apache软件基金会的一个开源项目,全称为Apache Commons DBCP,它是一个基于Java的数据库连接池实现。在Java应用程序中,DBCP被广泛用于管理数据库连接,以提高性能和资源利用率...
数据库连接池(Database Connection Pool,简称 DBCP)是一种在多用户并发访问数据库时提高数据库系统性能的技术。它通过预创建并管理一定数量的数据库连接,避免了每次连接数据库时的初始化开销,同时也能有效地...
在Java中配置DBCP数据库连接池涉及以下几个关键知识点: 1. **依赖引入**:首先,你需要在项目中引入DBCP的相关库。在Maven项目中,可以在pom.xml文件中添加如下依赖: ```xml <groupId>commons-dbcp ...
Apache DBCP(Database Connection Pool)是Apache软件基金会下的一个开源项目,主要提供数据库连接池服务。数据库连接池在Java应用程序中扮演着重要的角色,它能够有效地管理数据库连接,提高应用性能并降低资源...
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:commons-dbcp.jar,commons-pool.jar,commons-collections.jar由于建立...
DBCP,全称为Apache Database Connection Pool,是由Apache软件基金会开发的一款开源数据库连接池组件。它在Java应用程序中扮演着至关重要的角色,通过有效地管理和复用数据库连接,显著提高了数据库访问性能,同时...