C3P0和QueryRunner

1人阅读 评论(0) 收藏 举报
分类:

 C3P0:

放一句骚话:

      简单来说,C3P0连接池配置可以更NiuBi地让业务逻辑层和数据层打交道。

使用C3P0的必要性:

       使用传统的模式访问数据库,每次和数据库进行连接时都要将Connection加载到内存中,再验证用户名和密码。需要数据库连接的时候,就像数据库要求一个,执行完毕后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用。若同时有几百人甚至上千人在线,频繁的进行数据库连接与断开操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。对于每一次数据库连接,使用后都得断开连接。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄露,最终将导致重启数据库。这种开发不能控制被创建的连接对象数,系统资源会被毫无顾忌的分配出去,如果连接过多,也可能导致内存泄露,服务器崩溃。

引入数据库连接池:

       为解决传统开发中的数据库连接问题,可采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

数据库连接池的优点:

       1.资源重用:由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

       2.更快的系统反应速度:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间

       3.新的资源分配手段对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置实现某一应用最大可用数据库连接数的限制避免某一应用独占所有的数据库资源.

       4.统一的连接管理,避免数据库连接泄露在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露。

玩一玩C3P0数据库连接池:

       1.下载相应的jar包并导入

          1.1c3p0-0.9.1.2.jar

          1.2commons-dbutils-1.6.jar

          1.3mysql-connector-java-5.1.12-bin.jar

       2.在src中配置一个c3p0-config.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql:///chatroom</property>
		<property name="user">root</property>       <!-- 你登陆mysql的名称,一般为root -->
		<property name="password">******</property>    <!-- 你登陆mysql的密码,一般自己设置 -->
	</default-config> 
</c3p0-config>

       3.新建一个JDBCUtils工具类:

package cn.itcast.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.ResourceBundle;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * JDBC工具类:
 *  * 加载驱动
 *  * 获得连接
 *  * 释放资源
 *  * 代码都重复.
 * @author 倔强的瓜小黄
 *
 */
public class JDBCUtils {
	
	
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	// 获得连接池:
	public static DataSource getDataSource(){
		return dataSource;
	}
	// 获得连接
	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn = dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}


---------------------------------------------------------分割线------------------------------------------------------------------


QueryRunner:

       1.QueryRunner中提供了对SQL语句操作的api;

  2.主要有三个方法:

    2.1:query():用于执行select(查询);

    2.2:update():用于执行insert(插入)/update(更新)/delete(删除);

    2.3:batch():批处理;

此出只介绍query()方法~~~~

先在项目dao层中创建接口,再创建实现接口的类:

package cn.nuist.chatroom.dao;

import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import cn.nuist.chatroom.utils.JDBCUtils;
import cn.nuist.chatroom.vo.User;

public class UserDaoImplement implements UserDao{

	@Override
	public User login(User user) {
		QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
		String sql = "select * from user where username = ? and password = ?";
		User existUser;
		 try {
			existUser = queryRunner.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("用户登陆失败!");
		}
		return existUser;
	}
}

此处使用QueryRunner中的query()方法通过查询username和password实现对登陆用户进行验证,从而判断用户的合法性。

参考文献:https://blog.csdn.net/dapangzi88/article/details/63685190

查看评论

MIS通用设计

以下从三个方面完成MIS的设计:一、      了解客户需求我这里说的客户需求不是指客户的业务要怎么做,对于程序员来说过多的关心客户业务只能混乱思想,这里我将程序员和系统分析员拆开,客户业务如何完成,...
  • bbwolf
  • bbwolf
  • 2003-12-11 11:38:00
  • 946

用数据库连接池c3p0来连接数据库,用queryrunner来操作

一般在进行简单的java程序时,我们都会选择jdbc来连接数据库。但是你会发现jdbc操作数据库时的代码非常繁琐。那么有没有别的办法来替代jdbc来进行数据库的操作,且代码相当简单一点呢。答案是有的。...
  • gurenyuan123
  • gurenyuan123
  • 2015-12-19 14:44:55
  • 2713

采用事务、c3p0连接池配置、DBUtiles中的QueryRunner结合

  • 2017年10月27日 21:18
  • 1.61MB
  • 下载

02-使用C3P0连接池连接MySql并且使用QueryRunner简化数据库操作

1.导入相应的JARs mysql驱动jar包:mysql-connector-java-5.1.28-bin.jar C3P0需要的jar包:c3p0-0.9.2-pre1.jar和mchange-...
  • m664151356
  • m664151356
  • 2015-10-31 23:31:19
  • 1814

数据库小框架之——C3P0Utils

今天老师讲了一下如何简化后台编程,给我们挑了一个数据库后台的框架——C3P0Utils。一直是自己写的数据库操作代码,除了一些比较难的会用到框架,像数据库这种基 本上就自己写了。现在回过头来看,以前虽...
  • woshimalingyi
  • woshimalingyi
  • 2016-01-23 00:01:29
  • 1414

QueryRunner(DBUtils工具类)体现了:DBUtils封装了C3P0和jdbc。【三者的关系】

发展流程: jdbc》jdbc+c3p0(提供连接池)》DBUtils封装二者。
  • qq_20597149
  • qq_20597149
  • 2017-09-17 15:00:10
  • 104

java.sql.SQLException: QueryRunner requires a DataSource to be invoked in this way, or a Connection

这个错误是使用c3p0-0.9.2-pre1.jar配置数据库的时候,按照字面意思就是说:SQLException异常:QueryRunner需要一个数据源以这种方式调用,或者应该传入的连接池。我们看...
  • u010782846
  • u010782846
  • 2016-05-05 23:33:30
  • 5919

C3P0组件+DbUtils组件实现一个JdbcUtils工具类

一,准备工作 1)导入相应的驱动及jar包,如下图: 前面几篇博客都有对JDBC连接数据 DbUtils简化数据库操作 C3P0实现连接池进行了介绍. 二,代码环节 1)工具类JdbcUt...
  • bighuan
  • bighuan
  • 2017-04-08 10:50:23
  • 1048

使用数据库连接池(C3P0管理数据源)出现的Too many connections问题

使用了Spring的HibernateDaoSupport管理数据DAO,如果在方法中使用了this.getSession()获取session后,不在后面关闭session(session.clos...
  • moonsheep_liu
  • moonsheep_liu
  • 2012-05-01 21:16:03
  • 1571

解决用c3p0和dbutils无法持续插入数据到数据库,批量插入数据库

用C3P0读EXCEL表格中数据批量插到数据里
  • dream_follower
  • dream_follower
  • 2017-01-15 11:00:42
  • 782
    个人资料
    等级:
    访问量: 467
    积分: 148
    排名: 113万+
    文章分类
    文章存档