`
kingxss
  • 浏览: 973331 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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表:

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`),
);
 

导入数据库的驱动的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;
	}
}
 

 

分享到:
评论

相关推荐

    java常用数据源连接池配置

    ### Java常用数据源连接池配置详解 #### 一、引言 在Java Web开发中,数据库连接管理是一项至关重要的任务。...通过以上步骤,可以在Java Web应用中有效地配置和使用数据源连接池,提高应用程序的效率和稳定性。

    Tongweb5中配置JDBC连接池

    本文将详细介绍如何在Tongweb5中配置JDBC连接池,以及Web应用如何通过JNDI(Java Naming and Directory Interface)查找并使用这些数据源。 首先,我们需要了解JDBC连接池的基本原理。JDBC连接池是在应用启动时预...

    Tomcat配置数据源连接池示例

    本示例主要关注如何在Apache Tomcat服务器中配置数据源连接池,以提高数据库访问的效率和稳定性。Tomcat作为一个流行的Java Servlet容器,支持多种数据源连接池实现,如Apache Commons DBCP、C3P0、HikariCP等。在这...

    weblogic连接池配置数据库断掉重连的问题

    连接池配置包括两个主要部分:连接池和连接。连接池是指一个池中的所有连接的集合,而连接则是池中单个连接的实例。 二、断掉重连机制的原理 在 Weblogic 中,连接池配置数据库断掉重连机制是指当连接池中的连接断...

    Tomcat中配置数据源连接池

    在Java Web应用中,Tomcat作为一款流行的Servlet容器,提供了数据源连接池的配置功能,以便高效管理和复用数据库连接。本篇文章将详细介绍如何在Tomcat中配置数据源连接池,涉及的主要知识点包括: 1. **数据源配置...

    数据源和连接池

    ### 数据源和连接池知识点详解 #### 一、概述 在现代Web开发中,数据库连接是极其宝贵的资源。尤其在高并发环境下,频繁地创建和销毁数据库连接会显著降低系统的性能。为此,开发者通常采用数据库连接池技术来优化...

    was配置db2数据连接池

    - 在生产环境中,你应该定期监控连接池的使用情况,根据性能和负载调整连接池参数,以达到最佳性能。 以上步骤提供了配置DB2连接池的基本指南,但具体的配置可能会因为WAS版本和DB2版本的不同而略有差异。请务必...

    SpringBoot整合JDBC&Druid;数据源示例

    在本文中,我们将深入探讨如何在SpringBoot项目中整合JDBC和Druid数据源,并创建一个具有监控功能的示例。SpringBoot以其简洁的配置和快速的开发能力,深受Java开发者喜爱。而Druid作为一款优秀的数据库连接池,提供...

    完美的java jdbc连接池实例

    本实例提供了完美的Java JDBC连接池配置,适用于Oracle、MySQL和SQL Server等主流数据库,允许开发者轻松地在不同数据库之间切换方言。 首先,让我们了解什么是JDBC连接池。JDBC(Java Database Connectivity)是...

    Tomcat下对Oracle数据库连接池数据源的配置

    本教程将详细解释如何在Tomcat服务器上配置Oracle 10g数据库的连接池数据源。 首先,确保你已经安装了必要的软件环境: 1. Java环境:JDK 1.4 2. 服务器:Tomcat 5.5 3. 数据库:Oracle 10g 配置步骤如下: 1. **...

    java JDBC连接池

    理解JDBC连接池的工作原理和配置对于优化数据库应用性能至关重要。通过合理设置参数,可以平衡资源利用与性能需求,确保系统稳定运行。在实际开发中,除了Proxool外,还有其他流行的连接池实现,如C3P0、DBCP、...

    数据源连接池的-例子

    总结来说,本示例涵盖了两种不同的数据源连接池实现方式:c3p0,一种轻量级的连接池实现,以及JNDI结合jtds,适用于更大型的应用服务器环境。理解并正确使用这些技术,能帮助开发者优化数据库操作,提升应用性能,...

    Java Web 网络留言板2 JDBC数据源 (连接池技术).docx

    然而,关于JDBC数据源和连接池的具体实现并未给出,通常这些实现在后端服务端代码中,如Servlet或者Spring框架中配置。 #### 五、总结 综上所述,“Java Web网络留言板2”项目不仅实现了一个功能完善的留言板系统...

    WEBLOGIC_配置_JDBC_数据源

    本教程旨在教你如何为WebLogic实例创建和管理JDBC数据源,以优化数据库连接的管理和性能。 **概述** JDBC数据源是Java应用程序与数据库之间的桥梁,它通过Java Naming and Directory Interface (JNDI)提供了一个...

    weblogic控制台创建jdbc数据源

    在WebLogic控制台上创建JDBC数据源是连接数据库的关键步骤,这使得应用能够透明地访问数据库资源。下面我们将详细探讨这个过程。 1. **JDBC数据源的概念** JDBC数据源是WebLogic服务器中的一个对象,它封装了...

    关于JDBC连接池的java类

    这个提供的"JDBC连接池"类很可能是一个封装好的数据源类,它简化了连接池的配置和使用过程,使得开发者可以更专注于业务逻辑。导入此类后,只需按照类库的API进行操作,就能方便地管理和使用数据库连接。 总的来说...

    Tomcat5 连接池的配置 代码实例

    本篇文章将详细介绍如何在Tomcat5中配置连接池,并通过代码实例进行说明。 一、连接池概念与作用 连接池是预创建并维护一定数量的数据库连接,以便多个请求可以共享这些连接,而不是每次请求都创建新的连接。这种...

    jdbc连接池

    在数据库连接池的场景中,`jdom.jar`可能是用来配置数据库连接池参数,例如在XML配置文件中定义数据源的属性,如最大连接数、最小连接数、超时时间等。 在Java中,有很多流行的开源连接池实现,比如Apache的DBCP、...

    c3p0连接池配置使用

    c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用c3p0连接池可以有效地管理和优化数据库连接,提高系统的性能和稳定性。下面将详细介绍c3p0的配置和使用方法。 ### 1....

Global site tag (gtag.js) - Google Analytics