`
meiyoudao
  • 浏览: 89706 次
  • 性别: Icon_minigender_1
  • 来自: 冲脉
社区版块
存档分类
最新评论

使用开源的连接池DBCP

阅读更多
1.需要用的JAR包commons-collections-3.2.jar,commons-pool-1.3.jar,commons-dbcp-1.2.1.jar
2.需要一个配置文件properties(内容为下面XML)
3.创建数据源BasicDataSourceFactory.createDataSource(properties);

/*
DataSource用来取代DriverManager来获取Connection;
通过DataSource获得Connection速度很快;
通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接),他的close方法已经被修改,不是直接关闭连接,而是释放到连接池中。
一般DataSource内部会用一个连接池来缓存Connection,这样可以大幅度提高数据库的访问速度;
连接池可以理解成一个能够存放Connection的Collection;
我们的程序只和DataSource打交道,不会直接访问连接池;
*/


#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED


package com.meiyoudao.jdbc;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;




public final class JdbcUtils {
	private static String url = "jdbc:mysql://localhost:3306/jdbc";
	private static String user = "root";
	private static String password = "";
	private static DataSource myDataSource = null;

	private JdbcUtils() {
	}

	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");

			Properties prop = new Properties();
			// prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
			// prop.setProperty("user", "user");

			InputStream is = JdbcUtils.class.getClassLoader()
					.getResourceAsStream("dbcpconfig.properties");
			prop.load(is);
			myDataSource = BasicDataSourceFactory.createDataSource(prop);
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	public static DataSource getDataSource() {
		return myDataSource;
	}

	public static Connection getConnection() throws SQLException {
		// return DriverManager.getConnection(url, user, password);
		return myDataSource.getConnection();
	}

	public static void free(ResultSet rs, Statement st, Connection conn) {
		try {
			if (rs != null)
				rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (st != null)
					st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				if (conn != null)
					try {
						conn.close();
						// myDataSource.free(conn);
					} catch (Exception e) {
						e.printStackTrace();
					}
			}
		}
	}
}




/**
查询带有参数,和行映射方法:
	public Object queryForObject(String sql, Object[] args, RowMapper rowMapper),使用自定义的UserRowMapper完成映射。
一个RowMapper的常用实现BeanPropertyRowMapper,该实现可将结果集转换成一个Java Bean(字段名与Java Bean属性名不符合规范,可用别名处理)。
public List query(String sql, Object[] args, RowMapper rowMapper)返回多个结果。
public int queryForInt(String sql)(如:select count(*) from user),其他结果比如String可用queryForObject方法向下转型。
public Map queryForMap(String sql, Object[] args)返回若类型的Map(key:字段名或别名,value:列值)。
public List queryForList(String sql, Object[] args)返回多Map。

*/


package com.meiyoudao.jdbc.spring;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.meiyoudao.jdbc.JdbcUtils;
import com.meiyoudao.jdbc.domain.User;

/**
 * 
 *  Spring 的 JdbcTemplate 使用方法
 */
public class JdbcTemplateTest {

	static JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User user = findUser("zhangsan");
		// System.out.println("user:" + user);

		// System.out.println("users:" + findUsers(3));

		// System.out.println("user count:" + getUserCount());

		// System.out.println("user name:" + getUserName(1));

		System.out.println("data:" + getData(1));
	}

	static int addUser(final User user) {
		jdbc.execute(new ConnectionCallback() {

			public Object doInConnection(Connection con) throws SQLException,
					DataAccessException {
				String sql = "insert into user(name,birthday, money) values (?,?,?) ";
				PreparedStatement ps = con.prepareStatement(sql,
						Statement.RETURN_GENERATED_KEYS);
				ps.setString(1, user.getName());
				ps.setDate(2, new java.sql.Date(user.getBirthday().getTime()));
				ps.setFloat(3, user.getMoney());
				ps.executeUpdate();

				ResultSet rs = ps.getGeneratedKeys();
				if (rs.next())
					user.setId(rs.getInt(1));
				return null;
			}
		});
		return 0;
	}

	static Map getData(int id) {
		String sql = "select id as userId, name, money, birthday  from user where id="
				+ id;
		return jdbc.queryForMap(sql);
	}

	static String getUserName(int id) {
		String sql = "select name from user where id=" + id;
		Object name = jdbc.queryForObject(sql, String.class);
		return (String) name;
	}

	static int getUserCount() {
		String sql = "select count(*) from user";
		return jdbc.queryForInt(sql);
	}

	static List findUsers(int id) {
		String sql = "select id, name, money, birthday  from user where id<?";
		Object[] args = new Object[] { id };
		int[] argTypes = new int[] { Types.INTEGER };
		List users = jdbc.query(sql, args, argTypes, new BeanPropertyRowMapper(
				User.class));
		return users;
	}

	static User findUser(String name) {
		String sql = "select id, name, money, birthday  from user where name=?";
		Object[] args = new Object[] { name };
		Object user = jdbc.queryForObject(sql, args, new BeanPropertyRowMapper(
				User.class));
		return (User) user;
	}

	static User findUser1(String name) {
		String sql = "select id, name, money, birthday  from user where name=?";
		Object[] args = new Object[] { name };
		Object user = jdbc.queryForObject(sql, args, new RowMapper() {

			public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
				User user = new User();
				user.setId(rs.getInt("id"));
				user.setName(rs.getString("name"));
				user.setMoney(rs.getFloat("money"));
				user.setBirthday(rs.getDate("birthday"));
				return user;
			}
		});
		return (User) user;
	}
}



package com.meiyoudao.jdbc.spring;

import java.util.HashMap;
import java.util.Map;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import com.meiyoudao.jdbc.JdbcUtils;
import com.meiyoudao.jdbc.domain.User;

/**
 * 
 * NamedParameterJdbcTemplate内部包含了一个JdbcTemplate, 
 * 所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干;
 * NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数
 * 可以命名的功能。
 * public Object queryForObject(String sql, Map paramMap,
 *  RowMapper rowMapper)
 * public Object queryForObject(String sql, 
 * SqlParameterSource paramSource, RowMapper rowMapper)
 * 	SqlParameterSource的两个主要实现MapSqlParameterSource
 * 	和BeanPropertySqlParameterSource
 * public int update(String sql, SqlParameterSource
 *  paramSource, KeyHolder generatedKeyHolder)保存数据获得主键。
 * 
 */
public class NamedJdbcTemplate {
	static NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate(
			JdbcUtils.getDataSource());

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User user = new User();
		user.setMoney(10);
		user.setId(2);
		System.out.println(findUser1(user));
	}

	static void addUser(User user) {
		String sql = "insert into user(name,birthday, money) values (:name,:birthday,:money) ";
		SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
		KeyHolder keyHolder = new GeneratedKeyHolder();
		named.update(sql, ps, keyHolder);
		int id = keyHolder.getKey().intValue();
		user.setId(id);
		
		Map map = keyHolder.getKeys();
	}

	static User findUser(User user) {
		String sql = "select id, name, money, birthday  from user "
				+ "where money > :m and id < :id";
		Map params = new HashMap();
		// params.put("n", user.getName());
		params.put("m", user.getMoney());
		params.put("id", user.getId());
		Object u = named.queryForObject(sql, params, new BeanPropertyRowMapper(
				User.class));
		return (User) u;
	}

	static User findUser1(User user) {
		String sql = "select id, name, money, birthday  from user "
				+ "where money > :money and id < :id";
		SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
		Object u = named.queryForObject(sql, ps, new BeanPropertyRowMapper(
				User.class));
		return (User) u;
	}

}

分享到:
评论

相关推荐

    开源数据库连接池dbcp

    开源数据库连接池DBCP,全称为Jakarta-Commons-DBCP,是Apache软件基金会Jakarta项目中的一个组件,主要用于解决Java应用程序与数据库之间的连接管理问题。DBCP提供了一个高效且可配置的数据库连接池,使得多个...

    数据库连接池dbcp和c3p0jar包

    "数据库连接池dbcp和c3p0jar包"这个压缩包包含了这两个库的JAR文件,开发者可以解压并导入到自己的项目中,然后通过简单的代码配置来启用数据库连接池服务。例如,使用Spring框架,可以在配置文件中声明数据源,指定...

    数据库连接池DBCP,jar包

    DBCP(Jakarta DBCP)是Apache软件基金会的一个开源项目,它基于Jakarta Commons库,为多种数据库提供了连接池实现。 在Java中,数据库连接通常通过JDBC(Java Database Connectivity)API来实现。JDBC允许Java程序...

    dbcp连接池使用例子

    DBCP(Database Connection Pool)是Apache组织提供的一个开源数据库连接池组件,全称为"Commons DBCP"。它在Java应用中起到了管理和复用数据库连接的作用,从而提高应用程序的性能和效率。在这个"dbcp连接池使用...

    java数据库连接池dbcp

    在Java中,Apache Commons DBCP(Database Connection Pool)是一个常用的开源数据库连接池实现,它提供了数据库连接的创建、管理和复用功能,从而提高了应用性能,减少了与数据库的交互时间。 DBCP是基于Apache ...

    jdbc连接池dbcp工具包

    **JDBC连接池DBCP详解** Java数据库连接池(JDBC Connection Pool)是Java应用程序管理数据库连接的一种机制,它能够有效地提高数据库访问效率并优化资源使用。DBCP(Jakarta DBCP,又称为Apache Commons DBCP)是...

    数据库连接池dbcp

    数据库连接池(Database Connection Pool,简称 DBCP)是 Apache 组织提供的一款开源的 Java 数据库连接池组件。在 Java 应用程序尤其是企业级应用中,DBCP 被广泛用于管理数据库连接,提高了应用程序的性能和效率。...

    DBCP连接池DBCP和C3P0配置

    - **C3P0**:C3P0(Concise Connection Pooling for Java)是由mchange软件公司开发的一个开源连接池组件,提供了一整套管理JDBC资源的方法。 这两种连接池都能有效地管理和控制数据库连接的创建、分配、回收等过程...

    DBCP连接池所有jar包

    DBCP(Database Connection Pool)是Apache组织提供的一个开源数据库连接池组件,全称为"Jakarta DBCP"。它在Java应用中起到了管理和复用数据库连接的作用,从而提高应用程序的性能和效率。在Web项目开发中,DBCP...

    连接池DBCP需要的jar包

    这里提到的“连接池DBCP”是指Apache组织提供的一个开源数据库连接池实现——BasicDataSource,通常简称为DBCP。DBCP是基于Apache的Commons项目中的两个组件:commons-dbcp和commons-pool。 1. **commons-dbcp-...

    DBCP数据库连接池

    DBCP(Database Connection Pool)是Apache软件基金会的Commons DBCP项目提供的一款开源的数据库连接池组件。数据库连接池在Java应用中扮演着至关重要的角色,它通过维护一定数量的数据库连接,实现了数据库连接的...

    dbcp数据库连接池使用jar包

    DBCP(DataBase Connection Pool)是Apache组织开发的一个开源数据库连接池组件,它是Java应用程序中用于高效管理数据库连接的重要工具。数据库连接池的概念是基于资源复用的原理,它避免了频繁地创建和销毁数据库...

    数据库连接池DBCP包.7z

    DBCP(Jakarta DBCP,Apache Database Connection Pool)是Apache软件基金会提供的一个开源数据库连接池组件,它基于Jakarta Commons组件体系,为Java应用提供了高效且可配置的数据库连接池服务。 DBCP的使用涉及到...

    DBCP连接池的jar包

    DBCP(Database Connection Pool)是Apache组织提供的一种开源数据库连接池实现,全称为"Jakarta DBCP"。它基于Java编写,旨在提高数据库访问效率,通过复用已存在的数据库连接,减少创建和销毁数据库连接时的开销,...

    dbcp 连接池 jar包

    DBCP(Database Connection Pool)是Apache组织提供的一个开源数据库连接池组件,全称为"Commons DBCP"。它在Java应用中起到了管理和复用数据库连接的作用,从而提高应用程序的性能和效率。在给定的描述中提到,...

    DBCP(数据库连接池)

    DBCP,全称为Jakarta-Commons-DBCP,是一个基于Apache组织开发的开源数据库连接池组件。在Java应用程序中,DBCP可以帮助管理和优化数据库连接,提高应用性能和资源利用率。数据库连接池在多线程环境下尤其重要,因为...

    dbcp连接池jar包

    在Java中,使用DBCP连接池的基本步骤包括: 1. 引入DBCP的jar包(如commons-dbcp2-2.2.0.jar)。 2. 配置数据库连接参数,如URL、用户名、密码等。 3. 创建BasicDataSource实例,设置连接池的属性,如最大连接数、...

    Apache-DBCP数据库连接池

    Apache DBCP(Database Connection Pool)是Apache软件基金会下的一个开源项目,主要提供数据库连接池服务。数据库连接池在Java应用程序中扮演着重要的角色,它能够有效地管理数据库连接,提高应用性能并降低资源...

    数据库连接池dbcp.docx

    DBCP(Jakarta Commons DBCP,也称为 Apache Commons DBCP)是Apache软件基金会提供的一个开源数据库连接池组件。它允许Java应用程序高效且可管理地重用数据库连接,从而提高性能并减少资源消耗。数据库连接池在Java...

    常用数据库连接池 (DBCP、c3p0、Druid) 配置说明1

    本文主要探讨了三个常用的数据库连接池:DBCP、c3p0和Druid,以及它们的配置说明。 1. **DBCP(Apache Commons DBCP)** DBCP是Apache Commons项目的一部分,它依赖于Apache Commons Pool对象池机制来管理数据库...

Global site tag (gtag.js) - Google Analytics