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的语法,大家可以关注:《Thinking in Java 中文手册》、《JDK 1.7 参考手册官方英文版》、《JDK 1.6 API java 中文参考手册》、《JDK 1.5 API java 中文参考手册》,也希望大家多多支持我们。

(0)

相关推荐

  • sqlserverdriver配置方法 jdbc连接sqlserver

    一.下载驱动程序. 下载地址:http://download.microsoft.com/download/8/B/D/8BDABAE2-B6EA-41D4-B903-7916EF3690EF/sqljdbc_1.2.2323.101_enu.exe 首先下载到sql2005jdbc驱动sqljdbc_2.0.1008.2_enu.exe(版本号1.1之后都支持sql2005,2.0的支持sql2008) 下载的是一个解压就可以使用的,不需要要安装,你可以把这个包放在任何你想要放的地方,比如说你

  • 基于Java回顾之JDBC的使用详解

    尽管在实际开发过程中,我们一般使用ORM框架来代替传统的JDBC,例如Hibernate或者iBatis,但JDBC是Java用来实现数据访问的基础,掌握它对于我们理解Java的数据操作流程很有帮助. JDBC的全称是Java Database Connectivity. JDBC对数据库进行操作的流程:•连接数据库•发送数据请求,即传统的CRUD指令•返回操作结果集JDBC中常用的对象包括:•ConnectionManager•Connection•Statement•CallableStat

  • sqlserver的jdbc配置方法

    1.java中使用数据库需要用JDBC(java database connection)来连接和操作 下载地址:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774 2.完成后解压缩到任一盘,如:G:\Program Files\sqljdbc: 3.Microsoft JDBC Drivr 4.0 for SQL Server仅支持jdk1.6及以上版本,内部包含两个包:sqljdbc4.ja

  • Java使用JDBC连接数据库的实现方法

    本文实例讲述了Java使用JDBC连接数据库的实现方法,是Java数据库程序设计里非常实用的重要技巧.分享给大家供大家参考.具体如下: JDBC(Java Data Base Connectivity)数据库连接,通常我们在编写web应用或java应用程序要连接数据库时就要使用JDBC.使用JDBC连接数据库一般步骤有: 1.加载驱动程序 Class.forName(driver); 2.创建连接对象 Connection con = DriverManager.getConnection(ur

  • JDBC 程序的常见错误及调试方法

    数据库:MySQL 在编写应用的时候,为了调试程序方便,可以在异常处理代码中把异常信息显示出来,这样可以根据错误提示调试代码.异常处理代码通常可以写成这样: try{ - }catch(Exception e){ System.out.println(e.toString()); } 下面是一些常见的错误信息: (1)驱动程序不存在 提示的错误信息如下: java.lang.ClassNotFoundException: com.mysql.jdbc.Drive 后半部分是您在程序中写的驱动程序

  • JSP中使用JDBC访问SQL Server 2008数据库示例

    由JDBC驱动直接访问数据库 优点:100% Java,快又可跨平台 缺点:访问不同的数据库需要下载专用的JDBC驱动 (1)下载对应数据库版本的jdbc驱动并安装,注意安装后的得到的三个文件msbase.jar,mssqlserver.jar,msutil.jar,将其拷贝到jsp项目的WEB-INF/lib下面,也拷贝到Tomcat安装目录的lib下面,没有具体测试,应该和配置文件有关系. (2)数据源,不需要 (3)配置文件,不需要 (4)写JSP文件测试 <%@ page content

  • JDBC连接Oracle数据库常见问题及解决方法

    注:本文是斑竹从JDBC & Transaction版摘录广大站友的提问以及各种解答整理而来,如果您认为本文的内容已触犯了您的权益,请联系管理员进行修改. Jbuilder正确连接 oracle 9i需要注意的几个问题 oracle8以上的应该都使用classes12.jar文件作为jdbc驱动: 正确设置windows的classpath和jbuilder中的enterprise setup .configure libraries,将casses12.jar路径正确添加到上述需要设置的地方:

  • java使用jdbc连接数据库工具类和jdbc连接mysql数据示例

    这个工具类使用简单,实例化直接调用就可以了,大家还可以方便的根据自己的需要在里面增加自己的功能 复制代码 代码如下: package com.lanp.ajax.db; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException; /** * 连接数据库的工具类,被定

  • MyEclipse通过JDBC连接MySQL数据库基本介绍

    1.前提是MyEclipse已经能正常开发Java工程 2.安装MySQL 个人使用的是版本是 mysql-5.0.22-win32.zip 网址:http://www.mysql.com/downloads/mysql/#downloads 3.下载JDBC驱动 个人使用的是 mysql-connector-java-5.1.22.zip,所需要的就是解压缩之后其中的 mysql-connector-java-5.1.22-bin.jar 网址:http://www.mysql.com/dow

  • JDBC数据库的使用操作总结

    JDBC是一组能够执行SQL语句的API 由于传统的数据库操作方式需要程序员掌握各个不同的数据库的API,极其不便 因此java定义了JDBC这一标准的接口和类,为程序员操作数据库提供了统一的方式 JDBC的操作方式比较单一,由五个流程组成: 1.通过数据库厂商提供的JDBC类库向DriverManager注册数据库驱动 2.使用DriverManager提供的getConnection()方法连接到数据库 3.通过数据库的连接对象的createStatement方法建立SQL语句对象 4.执行

随机推荐