数据库连接池可以通过两种方式来应用,针对web应用和非web应用而来。

非web应用的数据库连接池配置

第一种方式:工厂类

非web应用可以使用工厂模式将数据库连接创建封装在一个工具类中,工具类中又使用单例模式来创建加载驱动,代码如下:

工厂类:ConnectPoolFactory.java

 import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties; import org.logicalcobwebs.proxool.configuration.PropertyConfigurator; public class ConnectPoolFactory { private static ConnectPoolFactory connectPoolFactory=null; private ConnectPoolFactory() {//构造方法
init();
} public void init(){//把properties文件加载到链接对象
InputStream is = ConnectPoolFactory.class.getResourceAsStream("/proxool.properties");
Properties properties = new Properties();
try {
properties.load(is);
PropertyConfigurator.configure(properties);
} catch (Exception e) {
e.printStackTrace();
}
} public static ConnectPoolFactory getInstance(){//单例模式
if(null == connectPoolFactory){
connectPoolFactory = new ConnectPoolFactory();
} return connectPoolFactory;
} public Connection getConnect(){
Connection conn=null;
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");// 加载数据库连接池配备的驱动
conn = DriverManager.getConnection("proxool.test");//proxool为配置文件名,test为连接池别名
} catch (Exception e) {
e.printStackTrace();
}
return conn;
} }

配置文件:proxool.properties

  jdbc-1.proxool.alias=test
#jdbc-1.proxool.driver-class=oracle.jdbc.OracleDriver
#jdbc-1.proxool.driver-url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc-1.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-1.proxool.driver-url=jdbc:mysql://localhost:3306/db_course
jdbc-1.user=root
jdbc-1.password=root jdbc-1.proxool.maximum-connection-count=8
jdbc-1.proxool.minimum-connection-count=5
jdbc-1.proxool.prototype-count=4
jdbc-1.proxool.verbose=true
jdbc-1.proxool.statistics=10s,1m,1d
jdbc-1.proxool.statistics-log-level=error

然后通过工厂类创建工厂对象,通过工厂对象获取连接池实例,通过实例创建连接

测试类:ProxoolTest.java

 public class ProxoolTest {
public static void main(String[] args) {
ConnectPoolFactory factory = ConnectPoolFactory.getInstance();
Connection connect = factory.getConnect();
System.out.println("ProxoolTest.main(conncet): " + connect);
}
}

第二种方式:工具类中加载

工具类:DBUtil.java

 public class DBUtil {
static {
InputStream is = DBUtil.class
.getResourceAsStream("/proxool.properties");
Properties properties = new Properties();
try {
properties.load(is);
PropertyConfigurator.configure(properties);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 获取数据库连接
*
* @return
*/
public static Connection getConn() {
Connection conn = null;
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
conn = DriverManager.getConnection("proxool.test");
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
} /**
* 获取sql语句发送器
*
* @param conn
* @return
*/
public static Statement getStmt(Connection conn) {
Statement stmt = null;
try {
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stmt;
} /**
* 获取预处理发送器
*
* @param conn
* @param sql
* @return
*/
public static PreparedStatement getPstmt(Connection conn, String sql) {
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return pstmt;
} /**
* 动态绑定参数
*
* @param pstmt
* @param params
*/
public static void bindParam(PreparedStatement pstmt, Object... params) {
for (int i = 0; i < params.length; i++) {
try {
pstmt.setObject(i + 1, params[i]);
} catch (SQLException e) {
e.printStackTrace();
}
}
} /**
* 关闭资源
* @param autoCloseables 实现了AutoCloseable接口的实现类对象
*/
public static void closeAll(AutoCloseable...autoCloseables) {
for (AutoCloseable autoCloseable : autoCloseables) {
if(autoCloseable!=null){
try {
autoCloseable.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
在web应用中使用数据库连接池

proxool.properties配置文件是不可少的,但是DBUtil.java中的静态代码块就不再需要了。

不过要在web.xml中添加如下代码:

 <!-- 配置连接池信息 -->
<servlet>
<servlet-name>servletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>propertyFile</param-name>
<param-value>WEB-INF/classes/proxool.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!-- 应用启动时加载配置信息 -->
</servlet> <!-- 监控连接池 -->
<servlet>
<servlet-name>adminServlet</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>adminServlet</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>

其中<url-pattern>/admin</url-pattern>用来配置访问监控连接池页面

数据库连接池proxool的两种使用方式的更多相关文章

  1. 第一章 Mybtais的两种启动方式

    Mybatis的两种启动方式如下: 1.xml实现: xml的实现方式中,主要是通过手动创建SqlSession,然后调用session.selectOne()方法实现来实现. 首先是创建Config ...

  2. Java中String对象两种赋值方式的区别

    本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...

  3. Spring学习之Spring与Mybatis的两种整合方式

    本机使用IDEA 2020.1.MySql 8.0.19,通过Maven进行构建 环境准备 导入maven依赖包 <dependencies> <dependency> < ...

  4. String 的两种实例化方式

    String 的两种实例化方式 隐式实例化:直接赋值 public class Demo { public static void main(String[] args) { String s = & ...

  5. Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式

    封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...

  6. String基础: String两种创建对象方式的比较

    字符串常量 在一般的语言中常量一旦声明则不可改变,在java中的字符串常量是以匿名对象来表示的 javaz中字符串两种定义方法: String strA= new String("hello ...

  7. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  8. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  9. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

随机推荐

  1. [Selenium] WebDriver 操作 HTML5 中的 drag/drop

    以 jQuery UI 官方网站元素测试,地址:http://jqueryui.com/draggable/ 示例: package com.learningselenium.html5; impor ...

  2. Struts2的各种标签库

    1 在JSP中使用taglib编译指令导入标签库 <%@ taglib prefix="s" uri="/struts-tags" %> ----- ...

  3. 「LuoguP1238」 走迷宫

    Description 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描 ...

  4. page-break-before和page-break-after

    page-break-before和page-break-after CSS属性并不会修改网页在屏幕上的显示,这两个属性是用来控制文件的打印方式. 每个打印属性都可以设定4种设定值:auto.alwa ...

  5. Bootstrap 网格系统的工作原理

    网格系统通过一系列包含内容的行和列来创建页面布局.下面列出了 Bootstrap 网格系统是如何工作的: 行必须放置在 .container class 内,以便获得适当的对齐(alignment)和 ...

  6. View Controller Programming Guide for iOS---(三)---Using View Controllers in Your App

    Using View Controllers in Your App Whether you are working with view controllers provided by iOS, or ...

  7. HDU 5882 Balanced Game (水题)

    题意:问 nnn 个手势的石头剪刀布游戏是否能保证出每种手势胜率都一样. 析:当每种手势的攻防个数完全相等才能保证平衡,所以容易得出 nnn 是奇数时游戏平衡,否则不平衡. 也就是说打败 i 的和 i ...

  8. 利用jenkins和docker实现持续交付

    利用jenkins和docker实现持续交付 一.什么是持续交付 让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定.持续的保持在随时可以发布的状况.它的目标在于让软件的构建.测试与发布变得更 ...

  9. HDOJ3231醉

    反正一开始就是瞎几把看题,然后题意理解了,什么飞机?只能去看题解了. 呵呵,可惜,题解看了三个小时,还是一知半解,先写了. - -菜鸡超级详细题解,强行掰弯一波,等下再问问别人吧. OK,OK开始!! ...

  10. kettle系列-我的开源kettle调度、管理平台[kettle-manager]介绍

    kettle管理工具 专门为kettle这款优秀的ETL工具开发的web端调度.管理工具. 新版本 项目简介 kettle作为非常优秀的开源ETL工具得到了非常广泛的使用,一般的使用的都是使用客户端操 ...