java connection pool_Java Web ConnectionPool (连接池技术)

根目录下:

dbpool.properties

代码:

driverClassName=oracle.jdbc.driver.OracleDriver

username=scott

password=tiger

url=jdbc:oracle:thin:@192.168.1.20:1521:ora9

poolSize=10

ConnectionPool.java

代码:

package webbook.util;

import java.io.FileInputStream;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.Properties;

import java.util.Vector;

public class ConnectionPool {

private Vector pool;

private String url;

private String username;

private String password;

private String driverClassName;

/**

* 连接池的大小,也就是连接池中有多少个数据库连接。

*/

private int poolSize = 1;

private static ConnectionPool instance = null;

/**

* 私有的构造方法,禁止外部创建本类的对象,要想获得本类的对象,通过getIstance方法。

* 使用了设计模式中的单子模式。

*/

private ConnectionPool() {

init();

}

/**

* 连接池初始化方法,读取属性文件的内容 建立连接池中的初始连接

*/

private void init() {

pool = new Vector(poolSize);

readConfig();

addConnection();

}

/**

* 返回连接到连接池中

*/

public synchronized void release(Connection conn) {

pool.add(conn);

}

/**

* 关闭连接池中的所有数据库连接

*/

public synchronized void closePool() {

for (int i = 0; i < pool.size(); i++) {

try {

((Connection) pool.get(i)).close();

} catch (SQLException e) {

e.printStackTrace();

}

pool.remove(i);

}

}

/**

* 返回当前连接池的一个对象

*/

public static ConnectionPool getInstance() {

if (instance == null) {

instance = new ConnectionPool();

}

return instance;

}

/**

* 返回连接池中的一个数据库连接

*/

public synchronized Connection getConnection() {

if (pool.size() > 0) {

Connection conn = pool.get(0);

pool.remove(conn);

return conn;

} else {

return null;

}

}

/**

* 在连接池中创建初始设置的的数据库连接

*/

private void addConnection() {

Connection conn = null;

for (int i = 0; i < poolSize; i++) {

try {

Class.forName(driverClassName);

conn = java.sql.DriverManager.getConnection(url, username, password);

pool.add(conn);

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

/**

* 读取设置连接池的属性文件

*/

private void readConfig() {

try {

String path = System.getProperty("user.dir") + "\\dbpool.properties";

FileInputStream is = new FileInputStream(path);

Properties props = new Properties();

props.load(is);

this.driverClassName = props.getProperty("driverClassName");

this.username = props.getProperty("username");

this.password = props.getProperty("password");

this.url = props.getProperty("url");

this.poolSize = Integer.parseInt(props.getProperty("poolSize"));

} catch (Exception e) {

e.printStackTrace();

System.err.println("读取属性文件出错. ");

}

}

}

ConnectionPoolTest.java

代码:

package webbook.util;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

public class ConnectionPoolTest {

public static void main(String[] args) throws Exception {

String sql = "select id,name,phone from guestbook";

long start = System.currentTimeMillis();

ConnectionPool pool = null;

for (int i = 0; i < 100; i++) {

pool = ConnectionPool.getInstance();

Connection conn = pool.getConnection();

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {

}

rs.close();

stmt.close();

pool.release(conn);

}

pool.closePool();

System.out.println("经过100次的循环调用,使用连接池花费的时间:" + (System.currentTimeMillis() - start) + "ms\n");

String hostName = "192.168.1.20";

String driverClass = "oracle.jdbc.driver.OracleDriver";

String url = "jdbc:oracle:thin:@" + hostName + ":1521:ora9";

String user = "scott";

String password = "tiger";

start = System.currentTimeMillis();

for (int i = 0; i < 100; i++) {

Class.forName(driverClass);

Connection conn = DriverManager.getConnection(url, user, password);

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {

}

rs.close();

stmt.close();

conn.close();

}

System.out.println("经过100次的循环调用,不使用连接池花费的时间:" + (System.currentTimeMillis() - start) + "ms");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你不想使用 `pool.size()` 和 `pool._used` 属性来查看当前连接池的连接数,你可以通过以下方式来实现: ```python import psycopg2 from psycopg2 import pool pool = psycopg2.pool.SimpleConnectionPool(minconn=1, maxconn=10, user="your_username", password="your_password", host="your_host", port=your_port, database="your_database") # 使用 getconn() 获取一个连接 conn = pool.getconn() # 使用 getconn() 方法获取连接时,连接池会自动管理连接数,因此无法直接获取当前连接数 # 但是可以通过连接的状态来判断连接数是否达到最大值 try: # 使用 with 语句来自动管理连接的生命周期 with conn: # 如果连接数已经达到最大值,这里会抛出异常 # 因为 SimpleConnectionPool 是一个线程安全的连接池,所以在使用连接之前需要对连接进行加锁 # 这里使用 conn.lock.acquire() 来获取锁 conn.lock.acquire() conn.lock.release() except pool.PoolError: # 如果连接数已经达到最大值,这里会抛出异常 print("连接数已经达到最大值") # 使用 putconn() 将连接放回连接池pool.putconn(conn) ``` 在上面的代码中,我们通过 `try...except` 语句来判断连接数是否已经达到最大值。使用 `getconn()` 方法获取连接时,连接池会自动管理连接数。但是在使用连接之前,我们需要对连接进行加锁,这样才能保证连接的线程安全。使用 `putconn()` 方法将连接放回连接池时,连接池会自动管理连接数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值