连接池管理类
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Vector; import com.mysql.jdbc.Driver; /** * ConnectionManager * * 数据库连接 * * @author bzwm * * @version 1.0 */ public class ConnectionManager { /** 连接数 */ static int iRequestCount = 0; /** 连接Pool */ static Vector connectionPool = null; /** 初始连接数 */ static final int INIT_NUM_CONNECTION = 2; /** 追加连接数 */ static final int ADD_NUM_CONNECTION = 1; /** 最大连接数 */ static final int MAX_NUM_CONNECTION = 10; /** 最小连接数 */ static final int MIN_NUM_CONNECTION = INIT_NUM_CONNECTION; /** 初始化标志 */ boolean bInitialized = false; static String serverName = "172.16.1.182"; static String sDBDriver = "com.mysql.jdbc.Driver"; static String dbInstance = "DB_QQ"; static String sConnStr = "jdbc:mysql://" + serverName + "/" + dbInstance; static String dbUser = "root"; static String userPwd = "123456"; static { try { Class.forName(sDBDriver); DriverManager.registerDriver(new Driver()); } catch (Exception ex) { ex.printStackTrace(); } } /** * ConnectionPoolElement * * 数据库连接数 */ class ConnectionPoolElement { Connection con; boolean used; } /** * 构造函数 * * @throws SQLException * */ public ConnectionManager() throws SQLException { if (connectionPool == null) { connectionPool = new Vector(); } init(); } /** * Connection的取得* * * @throws SQLException */ public synchronized Connection getConnection() throws SQLException { ConnectionPoolElement elm = null; for (;;) { synchronized (connectionPool) { for (int i = 0; i < connectionPool.size(); i++) { elm = (ConnectionPoolElement) (connectionPool.elementAt(i)); if (!elm.used) { elm.used = true; return elm.con; } } } // 超过最大连接数,则追加 if (connectionPool.size() < MAX_NUM_CONNECTION) { createConnectionPool(ADD_NUM_CONNECTION); } else { try { this.wait(100); } catch (InterruptedException e) { } } } } /** * 连接完之后发行 * * @param con * Connection * * @throws SQLException */ public synchronized void releaseConnection(Connection con) throws SQLException { ConnectionPoolElement elm; synchronized (connectionPool) { for (int i = 0; i < connectionPool.size(); i++) { elm = (ConnectionPoolElement) (connectionPool.elementAt(i)); if (elm.con == con) { elm.used = false; return; } } } throw new SQLException("unknown Connection"); } /** * 数据库初始化 * * @throws SQLException * */ public void init() throws SQLException { if (bInitialized) return; synchronized (connectionPool) { if (connectionPool.size() < INIT_NUM_CONNECTION) { try { // 数据库Pool的生成 createConnectionPool(INIT_NUM_CONNECTION); } catch (Exception ex) { ex.printStackTrace(); throw new SQLException("データベース初期化エラー"); } synchronized (this) { iRequestCount++; } } else { synchronized (this) { iRequestCount++; } } } bInitialized = true; } /** * 从数据库断开 * */ public void destroy() { synchronized (this) { iRequestCount--; } if (iRequestCount < 0) { try { destroyConnection(); } catch (SQLException ex) { } } } /** * 设定ConnectionPool* * * @param int * numConnection * @throws SQLException */ private synchronized void createConnectionPool(int numConnection) throws SQLException { ConnectionPoolElement elm; synchronized (connectionPool) { for (int i = 0; i < numConnection; i++) { elm = new ConnectionPoolElement(); elm.con = DriverManager.getConnection(sConnStr, dbUser, userPwd); connectionPool.addElement(elm); } } } /** * ConnectionPool的Connection的关闭 * * @throws SQLException * */ synchronized void destroyConnection() throws SQLException { ConnectionPoolElement elm; synchronized (connectionPool) { for (int i = 0; i < connectionPool.size(); i++) { elm = (ConnectionPoolElement) (connectionPool.elementAt(i)); elm.con.close(); } } } }
数据库操作类
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DBAccess { private ConnectionManager cm = null; public DBAccess() { try { cm = new ConnectionManager(); } catch (SQLException re) { re.printStackTrace(); } } private Connection getConnect() throws SQLException { return cm.getConnection(); } public void releaseConnection(Connection cn) throws SQLException { cm.releaseConnection(cn); } /** * 检索 * @param sqlId sqlid 对应于sql.properties中的id * @return 执行结果 List 中保存Map,每个Map是一个条记录。Key:列名,Value:值 * @throws SQLException */ public List executeQuery(String sqlId) throws SQLException { List resultList = new ArrayList(); ResultSet resultSet = null; PreparedStatement ps = null; Connection cn = null; try { cn = getConnect(); ps = cn.prepareStatement(getSQL(sqlId)); resultSet = ps.executeQuery(); Map map; for (; resultSet.next(); resultList.add(map)) { map = doCreateRow(resultSet); } } catch (SQLException sqle) { throw sqle; } catch (NullPointerException e) { } finally { try { resultSet.close(); ps.close(); releaseConnection(cn); } catch (NullPointerException e) { } } return resultList; } /** * 检索 * @param sqlId * @param strParams 查找时需要的params * @return * @throws SQLException */ public List executeQuery(String sqlId, String[] strParams) throws SQLException { List resultList = new ArrayList(); ResultSet resultSet = null; PreparedStatement ps = null; Connection cn = null; try { cn = getConnect(); ps = cn.prepareStatement(getSQL(sqlId)); for (int i = 1; i <= strParams.length; i++) { ps.setString(i, strParams[i - 1]); } resultSet = ps.executeQuery(); Map map; for (; resultSet.next(); resultList.add(map)) { map = doCreateRow(resultSet); } } catch (NullPointerException e) { } catch (SQLException sqle) { throw sqle; } finally { try { resultSet.close(); ps.close(); releaseConnection(cn); } catch (NullPointerException e) { } } return resultList; } /** * 更新DB * @param sqlId * @return * @throws SQLException */ public int executeUpdate(String sqlId) throws SQLException { int count = 0; Connection cn = null; PreparedStatement ps = null; try { cn = getConnect(); ps = cn.prepareStatement(getSQL(sqlId)); count = ps.executeUpdate(); cn.commit(); } catch (SQLException sqle) { throw sqle; } catch (NullPointerException e) { } finally { try { ps.close(); releaseConnection(cn); } catch (NullPointerException e) { } } return count; } /** * 更新DB * @param sqlId * @param lsParam * @return * @throws SQLException */ public int executeUpdate(String sqlId, String[] lsParam) throws SQLException { int count = 0; Connection cn = null; PreparedStatement ps = null; try { cn = getConnect(); ps = cn.prepareStatement(getSQL(sqlId)); for (int i = 1; i <= lsParam.length; i++) { ps.setString(i, lsParam[i - 1]); } count = ps.executeUpdate(); // cn.commit(); } catch (SQLException sqle) { throw sqle; } catch (NullPointerException e) { } finally { try { ps.close(); releaseConnection(cn); } catch (NullPointerException e) { } } return count; } /** * 根据id取得sql文 * @param sqlId * @return * @throws SQLException */ private String getSQL(String sqlId) throws SQLException { String sqlData = ""; if (sqlId == null || sqlId.length() == 0) { throw new SQLException(); } else { Map sqlMap = ResourceReader.getSqlMap(); sqlData = (String) sqlMap.get(sqlId); if (sqlData.trim().length() == 0) { throw new SQLException(); } else { return sqlData; } } } /** * 将执行sql文的结果放在List中 * @param resultSet * @return * @throws SQLException */ private final Map doCreateRow(ResultSet resultSet) throws SQLException { Map result = new HashMap(); try { ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); int count = resultSetMetaData.getColumnCount(); for (int i = 1; i <= count; i++) { String label = resultSetMetaData.getColumnLabel(i); Object value = resultSet.getObject(i); result.put(label.toUpperCase(), value); } } catch (SQLException e) { throw e; } return result; } }
根据sqlid 取得sql文
import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; /** * @author bzwm * */ public class ResourceReader { //sql.properties的路径,根据自己需要配置 private static final String _path = "com.chat.commons.property.sql"; private static ResourceReader _instance = null; private Map _sqlMap = new HashMap(); private ResourceReader() { try { ResourceBundle bundle = ResourceBundle.getBundle(_path); Enumeration enumeration = bundle.getKeys(); while (enumeration.hasMoreElements()) { String key = (String) enumeration.nextElement(); _sqlMap.put(key, bundle.getString(key)); } } catch (MissingResourceException e) { e.printStackTrace(); } } public synchronized static void initConfigFile() { if (_instance == null) _instance = new ResourceReader(); } public static Map getSqlMap() { return _instance._sqlMap; } public static void main(String args[]) { new ResourceReader(); } }
sql.properties 保存sql语句
sql001=select password from t_qq_user where qq_num = ?
用法:
//参数是sqlId和 qq号, sql001=select password from t_qq_user where qq_num = ? new DBAccess().executeQuery("sql001", new String[]{"123456"});
您还没有登录,请您登录后再发表评论
Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...
Java 实现数据库连接池主要涉及两个关键点:减少使用者与连接池之间的耦合度和接管 `Connection.close()` 方法。为了实现这两个目标,我们可以利用 Java 的动态代理机制。 首先,了解数据库连接池的作用。连接池是...
基于JAVA语言的一种有效的数据库连接池的实现代码。
### JAVA 使用数据库连接池连接Oracle数据库全代码解析 #### 一、概述 本文将详细介绍如何在Java项目中使用Apache DBCP(Database Connection Pool)来连接Oracle数据库,并提供完整的示例代码。通过这种方式,我们...
在本主题中,我们将探讨如何使用Java的动态代理技术来实现一个更灵活、耦合度更低的数据库连接池。 首先,让我们了解动态代理的工作原理。在Java中,动态代理允许我们在运行时创建一个实现了指定接口的新类。这个新...
在Java中,数据库连接池通常通过第三方库如Apache的DBCP、C3P0或HikariCP来实现。然而,为了学习目的,我们可以自己模拟一个简单的连接池。这个项目的核心概念包括: 1. **连接创建与管理**:在应用启动时,连接池...
本文将介绍一个简单的数据库连接池实现,包括设计思路和关键类的讲解。 首先,我们来看一下数据库连接池的核心类: 1. **ConnectionParam**:这是一个配置类,用于存储数据库连接的相关参数,如驱动名(driver)、...
Java JDBC 数据库连接池总结 Java JDBC 数据库连接池是 Java 应用程序访问数据库的基本原理之一。Java 语言通过 JDBC 技术访问数据库,JDBC 是一种“开放”的方案,为数据库应用开发人员和数据库前台工具开发人员...
总结,Java 完整的数据库连接池实现涉及到选择合适的连接池实现、配置参数、初始化连接池以及在代码中正确地获取和释放连接。理解这些概念和步骤对于优化 Java 应用程序的数据库性能至关重要。通过合理配置和使用...
在实际开发中,虽然手写数据库连接池可以加深对数据库连接池原理的理解,但更常见的情况是使用成熟的连接池实现,如C3P0、Apache DBCP、HikariCP等,它们经过大量优化,提供了更好的性能和稳定性。 总的来说,理解...
在Java中,有多种数据库连接池实现,包括C3P0、DBCP和Proxool等。 **C3P0连接池配置参数详解** 1. `acquireIncrement`:当连接池中的连接耗尽时,一次同时尝试获取的连接数。默认值为3,意味着如果连接池为空,它...
描述:本篇将详细介绍Java数据库连接池的概念,代码实现以及其在实际项目中的应用。数据库连接池是Java开发中优化数据库访问效率的关键技术,通过复用预创建的数据库连接,避免频繁创建和销毁连接带来的性能开销。 ...
在本文中,我们将探讨如何使用Java的动态代理来实现数据库连接池,从而解决传统连接池设计中的耦合度问题和资源管理问题。 首先,数据库连接池是应用程序管理数据库连接的一种高效方式。它通过复用已建立的数据库...
在Java中,常见的数据库连接池实现有C3P0、Apache DBCP、HikariCP等。本文将介绍一个简单的自定义数据库连接池实现,主要涉及以下几个核心组件: 1. **连接池配置**:定义连接池的大小、超时时间、数据库连接参数...
Java数据库连接池是Java开发中一个非常重要的技术,它主要用于管理数据库连接,提高数据库操作的效率和性能。在Java应用程序中,频繁地创建和关闭数据库连接会导致大量的系统资源浪费,而连接池则可以复用已建立的...
本文将深入探讨数据库连接池的工作原理、重要性以及如何在Java中实现一个简单的连接池。 首先,数据库连接池是管理数据库连接的一种机制,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的...
相关推荐
Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...
Java 实现数据库连接池主要涉及两个关键点:减少使用者与连接池之间的耦合度和接管 `Connection.close()` 方法。为了实现这两个目标,我们可以利用 Java 的动态代理机制。 首先,了解数据库连接池的作用。连接池是...
基于JAVA语言的一种有效的数据库连接池的实现代码。
### JAVA 使用数据库连接池连接Oracle数据库全代码解析 #### 一、概述 本文将详细介绍如何在Java项目中使用Apache DBCP(Database Connection Pool)来连接Oracle数据库,并提供完整的示例代码。通过这种方式,我们...
在本主题中,我们将探讨如何使用Java的动态代理技术来实现一个更灵活、耦合度更低的数据库连接池。 首先,让我们了解动态代理的工作原理。在Java中,动态代理允许我们在运行时创建一个实现了指定接口的新类。这个新...
在Java中,数据库连接池通常通过第三方库如Apache的DBCP、C3P0或HikariCP来实现。然而,为了学习目的,我们可以自己模拟一个简单的连接池。这个项目的核心概念包括: 1. **连接创建与管理**:在应用启动时,连接池...
本文将介绍一个简单的数据库连接池实现,包括设计思路和关键类的讲解。 首先,我们来看一下数据库连接池的核心类: 1. **ConnectionParam**:这是一个配置类,用于存储数据库连接的相关参数,如驱动名(driver)、...
Java JDBC 数据库连接池总结 Java JDBC 数据库连接池是 Java 应用程序访问数据库的基本原理之一。Java 语言通过 JDBC 技术访问数据库,JDBC 是一种“开放”的方案,为数据库应用开发人员和数据库前台工具开发人员...
总结,Java 完整的数据库连接池实现涉及到选择合适的连接池实现、配置参数、初始化连接池以及在代码中正确地获取和释放连接。理解这些概念和步骤对于优化 Java 应用程序的数据库性能至关重要。通过合理配置和使用...
在实际开发中,虽然手写数据库连接池可以加深对数据库连接池原理的理解,但更常见的情况是使用成熟的连接池实现,如C3P0、Apache DBCP、HikariCP等,它们经过大量优化,提供了更好的性能和稳定性。 总的来说,理解...
在Java中,有多种数据库连接池实现,包括C3P0、DBCP和Proxool等。 **C3P0连接池配置参数详解** 1. `acquireIncrement`:当连接池中的连接耗尽时,一次同时尝试获取的连接数。默认值为3,意味着如果连接池为空,它...
描述:本篇将详细介绍Java数据库连接池的概念,代码实现以及其在实际项目中的应用。数据库连接池是Java开发中优化数据库访问效率的关键技术,通过复用预创建的数据库连接,避免频繁创建和销毁连接带来的性能开销。 ...
在本文中,我们将探讨如何使用Java的动态代理来实现数据库连接池,从而解决传统连接池设计中的耦合度问题和资源管理问题。 首先,数据库连接池是应用程序管理数据库连接的一种高效方式。它通过复用已建立的数据库...
在Java中,常见的数据库连接池实现有C3P0、Apache DBCP、HikariCP等。本文将介绍一个简单的自定义数据库连接池实现,主要涉及以下几个核心组件: 1. **连接池配置**:定义连接池的大小、超时时间、数据库连接参数...
Java数据库连接池是Java开发中一个非常重要的技术,它主要用于管理数据库连接,提高数据库操作的效率和性能。在Java应用程序中,频繁地创建和关闭数据库连接会导致大量的系统资源浪费,而连接池则可以复用已建立的...
本文将深入探讨数据库连接池的工作原理、重要性以及如何在Java中实现一个简单的连接池。 首先,数据库连接池是管理数据库连接的一种机制,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的...