JDBC数据源连接池的配置和使用实例
个人学习参考所用,勿喷!
使用JDBC建立数据库连接的两种方式:
1.在代码中使用DriverManager获得数据库连接。这种方式效率低,并且其性能、可靠性和稳定性随着用户访问量得增加逐渐下降。
2.使用配置数据源的方式连接数据库,该方式其实质就是在上述方法的基础上增加了数据库连接池,这种方式效率高。
数据源连接池的方式连接数据库与在代码中使用DriverManager获得数据库连接存在如下差别:
1) 数据源连接池的方式连接数据库是在程序中,通过向一个JNDI(Java Naming and Directory Interface)服务器查询,即调用Context接口的lookup()方法,来得到DataSource对象,然后调用DataSource对象 的getConnection()方法建立连接
2) 为了能重复利用数据库连接对象,提高对请求的响应时间和服务器的性能,采用连接池技术.连接池技术预先建立多个数据库连接对象,然后将连接对象保存到连接 池中,当客户请求到来时,从池中取出一个连接对象为客户服务,当请求完成时,客户程序调用close()方法,将连接对象放回池中.
3) 在代码中使用DriverManager获得数据库连接的方式中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采 用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的close()方法,物理连接并没有关闭,数据源的实现只是删除了客 户程序中的连接对象和池中的连接对象之间的联系.
为了测试方便可以在数据库(这里以mysql 5为例)中建立一个USER表:
- <span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: x-small;">CREATE TABLE `user` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `username` varchar(50) DEFAULT NULL,
- `password` varchar(50) DEFAULT NULL,
- `email` varchar(50) DEFAULT NULL,
- PRIMARY KEY (`id`),
- );</span>
导入数据库的驱动的jar包到tomcat的lib目录下(这里以mysql5为例,所用到的jar包为:mysql-connector-java-5.0.8-bin.jar)。
1.在代码中使用DriverManager获得数据库连接。这种方式效率低,并且其性能、可靠性和稳定性随着用户访问量得增加逐渐下降。
oracle数据库连接的Java代码如下:
- import java.sql.Connection;
- import java.sql.DriverManager;
- /**
- * 获取数据库连接
- */
- public class DBConnection {
- /** Oracle数据库连接URL*/
- private final static String DB_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
- /** Oracle数据库连接驱动*/
- private final static String DB_DRIVER = "oracle.jdbc.driver.OracleDriver";
- /** 数据库用户名*/
- private final static String DB_USERNAME = "root";
- /** 数据库密码*/
- private final static String DB_PASSWORD = "admin";
- /**
- * 获取数据库连接
- * @return
- */
- public Connection getConnection(){
- /** 声明Connection连接对象*/
- Connection conn = null;
- try{
- /** 使用Class.forName()方法自动创建这个驱动程序的实例且自动调用DriverManager来注册它*/
- Class.forName(DB_DRIVER);
- /** 通过DriverManager的getConnection()方法获取数据库连接*/
- conn = DriverManager.getConnection(DB_URL,DB_USERNAME,DB_PASSWORD);
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return conn;
- }
- /**
- * 关闭数据库连接
- *
- * @param connect
- */
- public void closeConnection(Connection conn){
- try{
- if(conn!=null){
- /** 判断当前连接连接对象如果没有被关闭就调用关闭方法*/
- if(!conn.isClosed()){
- conn.close();
- }
- }
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- }
mysql数据库连接的JSP代码如下:
- <%@page import="java.sql.*, com.mysql.jdbc.Driver"%>
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <html>
- <body>
- <%
- //com.mysql.jdbc.Driver
- Class.forName(Driver.class.getName()).newInstance();
- String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF8";
- String user = "root";
- String password = "123";
- Connection conn = DriverManager.getConnection(url, user, password);
- Statement stmt = conn.createStatement();
- String sql = "select * from user";
- ResultSet rs = stmt.executeQuery(sql);
- while(rs.next()) {
- out.print("<br />" + "====================" + "<br />");
- out.print(rs.getLong("id") + " ");
- out.print(rs.getString("username") + " ");
- out.print(rs.getString("password") + " ");
- out.print(rs.getString("email") + " ");
- }
- %>
- </body>
- </html>
2.使用配置数据源的方式连接数据库,该方式其实质就是在上述方法的基础上增加了数据库连接池,这种方式效率高。
1)mysql数据库数据源连接池的JSP代码如下:
- <%@page import="java.sql.*, javax.naming.*, javax.sql.DataSource"%>
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <html>
- <body>
- <%
- Context initCtx = new InitialContext();
- DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/demoDB");
- Connection conn = ds.getConnection();
- Statement stmt = conn.createStatement();
- String sql = "select * from user";
- ResultSet rs = stmt.executeQuery(sql);
- while(rs.next()) {
- out.print("<br />" + "====================" + "<br />");
- out.print(rs.getLong("id") + " ");
- out.print(rs.getString("username") + " ");
- out.print(rs.getString("password") + " ");
- out.print(rs.getString("email") + " ");
- }
- %>
- </body>
- </html>
2) 添加如下代码到tomcat的conf目录下的server.xml中:
- <Context>
- <Resource name="jdbc/demoDB" auth="Container"
- type="javax.sql.DataSource"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/demo"
- username="root"
- password="123"
- maxActive="50"
- maxIdle="30"
- maxWait="10000" />
- </Context>
3)在web工程目录下的web.xml的根节点下配置如下内容:
- <resource-ref>
- <description>mysqlDB Connection</description>
- <res-ref-name>jdbc/demoDB</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
完成上述步骤数据源的连接池配置已经完成,但是为了提高项目的可移植性,最好将上述第二步的内容放入到工程的META-INF目录的context.xml中(这个文件需要自行建立):
- <?xml version="1.0" encoding="UTF-8"?>
- <Context>
- <Resource name="jdbc/demoDB" auth="Container"
- type="javax.sql.DataSource"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/demo"
- username="root"
- password="123"
- maxActive="50"
- maxIdle="30"
- maxWait="10000" />
- </Context>
3.使用配置数据源的数据库连接池时的数据库操作工具类
代码如下:
- package db.utils;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.text.DateFormat;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.naming.InitialContext;
- import javax.sql.DataSource;
- //import org.apache.log4j.Logger;
- /**
- * 数据库操作辅助类
- */
- public class DbUtils {
- //private static Logger logger = Logger.getLogger("DbUtils");
- /**
- * 该语句必须是一个 SQL INSERT、UPDATE 或 DELETE 语句
- * @param sql
- * @param paramList:参数,与SQL语句中的占位符一一对应
- * @return
- * @throws Exception
- */
- public int execute(String sql, List<Object> paramList) throws Exception {
- if(sql == null || sql.trim().equals("")) {
- //logger.info("parameter is valid!");
- }
- Connection conn = null;
- PreparedStatement pstmt = null;
- int result = 0;
- try {
- conn = getConnection();
- pstmt = DbUtils.getPreparedStatement(conn, sql);
- setPreparedStatementParam(pstmt, paramList);
- if(pstmt == null) {
- return -1;
- }
- result = pstmt.executeUpdate();
- } catch (Exception e) {
- //logger.info(e.getMessage());
- throw new Exception(e);
- } finally {
- closeStatement(pstmt);
- closeConn(conn);
- }
- return result;
- }
- /**
- * 将查询数据库获得的结果集转换为Map对象
- * @param sql:查询语句
- * @param paramList:参数
- * @return
- */
- public List<Map<String, Object>> getQueryList(String sql, List<Object> paramList) throws Exception {
- if(sql == null || sql.trim().equals("")) {
- //logger.info("parameter is valid!");
- return null;
- }
- Connection conn = null;
- PreparedStatement pstmt = null;
- ResultSet rs = null;
- List<Map<String, Object>> queryList = null;
- try {
- conn = getConnection();
- pstmt = DbUtils.getPreparedStatement(conn, sql);
- setPreparedStatementParam(pstmt, paramList);
- if(pstmt == null) {
- return null;
- }
- rs = getResultSet(pstmt);
- queryList = getQueryList(rs);
- } catch (RuntimeException e) {
- //logger.info(e.getMessage());
- System.out.println("parameter is valid!");
- throw new Exception(e);
- } finally {
- closeResultSet(rs);
- closeStatement(pstmt);
- closeConn(conn);
- }
- return queryList;
- }
- private void setPreparedStatementParam(PreparedStatement pstmt, List<Object> paramList) throws Exception {
- if(pstmt == null || paramList == null || paramList.isEmpty()) {
- return;
- }
- DateFormat df = DateFormat.getDateTimeInstance();
- for (int i = 0; i < paramList.size(); i++) {
- if(paramList.get(i) instanceof Integer) {
- int paramValue = ((Integer)paramList.get(i)).intValue();
- pstmt.setInt(i+1, paramValue);
- } else if(paramList.get(i) instanceof Float) {
- float paramValue = ((Float)paramList.get(i)).floatValue();
- pstmt.setFloat(i+1, paramValue);
- } else if(paramList.get(i) instanceof Double) {
- double paramValue = ((Double)paramList.get(i)).doubleValue();
- pstmt.setDouble(i+1, paramValue);
- } else if(paramList.get(i) instanceof Date) {
- pstmt.setString(i+1, df.format((Date)paramList.get(i)));
- } else if(paramList.get(i) instanceof Long) {
- long paramValue = ((Long)paramList.get(i)).longValue();
- pstmt.setLong(i+1, paramValue);
- } else if(paramList.get(i) instanceof String) {
- pstmt.setString(i+1, (String)paramList.get(i));
- }
- }
- return;
- }
- /**
- * 获得数据库连接
- * @return
- * @throws Exception
- */
- private Connection getConnection() throws Exception {
- InitialContext cxt = new InitialContext();
- DataSource ds = (DataSource) cxt.lookup(jndiName);
- if ( ds == null ) {
- throw new Exception("Data source not found!");
- }
- return ds.getConnection();
- }
- private static PreparedStatement getPreparedStatement(Connection conn, String sql) throws Exception {
- if(conn == null || sql == null || sql.trim().equals("")) {
- return null;
- }
- PreparedStatement pstmt = conn.prepareStatement(sql.trim());
- return pstmt;
- }
- /**
- * 获得数据库查询结果集
- * @param pstmt
- * @return
- * @throws Exception
- */
- private ResultSet getResultSet(PreparedStatement pstmt) throws Exception {
- if(pstmt == null) {
- return null;
- }
- ResultSet rs = pstmt.executeQuery();
- return rs;
- }
- /**
- * @param rs
- * @return
- * @throws Exception
- */
- private List<Map<String, Object>> getQueryList(ResultSet rs) throws Exception {
- if(rs == null) {
- return null;
- }
- ResultSetMetaData rsMetaData = rs.getMetaData();
- int columnCount = rsMetaData.getColumnCount();
- List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
- while (rs.next()) {
- Map<String, Object> dataMap = new HashMap<String, Object>();
- for (int i = 0; i < columnCount; i++) {
- dataMap.put(rsMetaData.getColumnName(i+1), rs.getObject(i+1));
- }
- dataList.add(dataMap);
- }
- return dataList;
- }
- /**
- * 关闭数据库连接
- * @param conn
- */
- private void closeConn(Connection conn) {
- if(conn == null) {
- return;
- }
- try {
- conn.close();
- } catch (SQLException e) {
- //logger.info(e.getMessage());
- }
- }
- /**
- * 关闭
- * @param stmt
- */
- private void closeStatement(Statement stmt) {
- if(stmt == null) {
- return;
- }
- try {
- stmt.close();
- } catch (SQLException e) {
- //logger.info(e.getMessage());
- }
- }
- /**
- * 关闭
- * @param rs
- */
- private void closeResultSet(ResultSet rs) {
- if(rs == null) {
- return;
- }
- try {
- rs.close();
- } catch (SQLException e) {
- //logger.info(e.getMessage());
- }
- }
- private String jndiName = "java:/comp/env/jdbc/demoDB";
- public void setJndiName(String jndiName) {
- this.jndiName = jndiName;
- }
- }
原文:http://kingxss.iteye.com/blog/1479451
JDBC数据源连接池的配置和使用实例的更多相关文章
- springboot添加多数据源连接池并配置Mybatis
springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018 ...
- JDBC数据源连接池(4)---自定义数据源连接池
[续上文<JDBC数据源连接池(3)---Tomcat集成DBCP>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究 ...
- JDBC数据源连接池(3)---Tomcat集成DBCP
此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...
- JDBC数据源连接池(2)---C3P0
我们接着<JDBC数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3P0的j ...
- JDBC数据源连接池(1)---DBCP
何为数据源呢?也就是数据的来源.我在前面的一篇文章<JDBC原生数据库连接>中,采用了mysql数据库,数据来源于mysql,那么mysql就是一种数据源.在实际工作中,除了mysql,往 ...
- Spring+Tomcat的JNDI数据源连接池简单配置
使用Tomcat JNDI数据源与Spring一起使用步骤如下: 1.将数据库驱动复制到Tomcat的lib文件夹下面 2.配置Tomcat的server.xml配置文件,在GlobalNamingR ...
- JavaWeb之数据源连接池(4)---自定义数据源连接池
[续上文<JavaWeb之数据源连接池(3)---Tomcat>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究其原 ...
- JavaWeb之数据源连接池(3)---Tomcat
此文续 <JavaWeb之数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先, ...
- JavaWeb之数据源连接池(2)---C3P0
我们接着<JavaWeb之数据源连接池(1)---DBCP>继续介绍数据源连接池. 首先,在Web项目的WebContent--->WEB-INF--->lib文件夹中添加C3 ...
随机推荐
- SQL Server分区动态生成脚本(三)(按年份划分)
--生成分区脚本DECLARE @DataBaseName NVARCHAR(50)--数据库名称DECLARE @TableName NVARCHAR(50)--表名称DECLARE @Column ...
- a标签的 target 使用
<a target="_blank" href="www.baidu.com" onclick="return test()"> ...
- SVN管理工具Cornerstone之:创建分支、提交合并
创建工程的分支: 步骤: 1.选择左下角仓库repositories中的工程名->选择trunk->点击Branch->在提示框里填写分支名称create, 2.在做上角work ...
- [Android] hid设备按键流程简述
hexdump /dev/hidraw0就能看到usbhid设备传输过来的裸流 如:按下Input键 003ae60 0000 0096 8000 006b 0000 0000 0000 0000 * ...
- 三个QT咨询公司以及QT5.0的主要特点
三个咨询公司(他们也贡献代码):http://www.kdab.com/http://v-play.net/http://www.ics.com/qt 一个论坛:http://forum.qt.io/ ...
- org.elasticsearch.bootstrap : JNA not found. native methods will be disabled
在pom.xml中添加以下依赖,解决elasticsearch的WARN: <dependency> <groupId>com.sun.jna</groupId> ...
- BZOJ1660: [Usaco2006 Nov]Bad Hair Day 乱发节
1660: [Usaco2006 Nov]Bad Hair Day 乱发节 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 606 Solved: 289 ...
- JavaScript AMD 模块加载器原理与实现
关于前端模块化,玉伯在其博文 前端模块化开发的价值 中有论述,有兴趣的同学可以去阅读一下. 1. 模块加载器 模块加载器目前比较流行的有 Requirejs 和 Seajs.前者遵循 AMD规范,后者 ...
- -_-#【Canvas】绘制文本
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【动态规划】XMU 1030 苦恼的月下老人
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1030 题目大意: 给定两个字符串的长度和内容,求最长公共子序列. 题目思路: [动态规 ...