数据库连接池可以通过两种方式来应用,针对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. 调节音量的各个方法——AudioManager的使用

    AudioManager类位于android.Media包中,该类提供访问控制音量和铃声模式的操作. //获取AudioManager实例对象 AudioManager audioManage = ( ...

  2. SPOJ:Divisors of factorial (hard) (唯一分解&分块优化)

    Factorial numbers are getting big very soon, you'll have to compute the number of divisors of such h ...

  3. iOS bounds、frame之间的关系

    这几个都是在ios程序中,经常会注意到的一些小细节,能否真正了解这些,对写ios程序也有很大的好处. frame 是UIView中表示此view的一个矩形面积,包括了view在它的superview中 ...

  4. 洛谷P3830 [SHOI2012]随机树——概率期望

    题目:https://www.luogu.org/problemnew/show/P3830 询问1:f[x]表示有x个叶节点的树的叶节点平均深度: 可以把被扩展的点的深度看做 f[x-1] ,于是两 ...

  5. 常用的Ant风格书写

    原文地址 Ant风格,为请求路径的一种匹配方式 通配符 说明 ? 匹配任意一个字符 * 匹配任意字符(包括0个) **  匹配任意层路径(包括0个) 支持Ant风格 1.spring资源加载 clas ...

  6. android调用第三方库——第一篇 (转载)

    转自:http://blog.csdn.net/jiuyueguang/article/details/9447245 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言: 这两天一直在研 ...

  7. POJ3250【单调栈】

    思路: 维护一个单调递增的栈,对于栈顶元素<=新值来说,那么后面的,我一定看不到了,pop掉以后,那么这时候的栈的大小就是我能看到的这个刚刚pop出去元素的个数. //#include < ...

  8. hdoj1728【搜索的两种写法】

    以前的一道题目,现在拿到总觉得是DFS,然后T掉就没什么想法了,很狗的看了以前的写法(以前还是看题解的AC的),是BFS,每次都要转弯,但是之前你的达到一种他走到了死路,所以才是不得不转弯,写法也是非 ...

  9. loj#2541. 「PKUWC2018」猎人杀

    传送门 思路太清奇了-- 考虑容斥,即枚举至少有哪几个是在\(1\)号之后被杀的.设\(A=\sum_{i=1}^nw_i\),\(S\)为那几个在\(1\)号之后被杀的人的\(w\)之和.关于杀了人 ...

  10. 用纯XMLHttpRequest实现AJAX

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...