Connection Pool (1)

Connection Pool (1)

(史帝芬, idealist@gcn.net.tw, 2003/09/19)

  用Connection Pool存取資料庫可以減少建立Connection的時間,struts1.0.2原本提供一個名為GenericDataSource的class 可以用來建立Connection Pool,在struts 1.1時將它廢棄了,原因是現在的資料庫附的Driver多半已經提供了DataSource,而且,使用資料庫提供的DataSource建立的Connection Pool更穩固!
  在Oracle中提供的是 OracleConnectionPoolDataSource,我用這個DataSource建立了一個Connection Pool,原始碼如下。(參考JSP教學手冊)

ConnectionPool.java
package tw.idv.idealist.db;

import java.sql.SQLException;
import java.sql.Connection;
import javax.sql.DataSource;

public class ConnectionPool {
 private DataSource ds;
 private static ConnectionPool mySelf;

 private ConnectionPool(DataSource ds) {
  this.ds = ds;
 }

 protected static void init(DataSource ds) {
  mySelf = new ConnectionPool(ds);
 }

 public static ConnectionPool getIstance() {
  if (mySelf == null) {
   throw new IllegalStateException("Pool not initialized.");
  }
  return mySelf;
 }

 public Connection getConnection() throws SQLException {
  return ds.getConnection();
 }
}

DBInitServlet.java
/*
設為container啟動時啟動
*/
package tw.idv.idealist.db;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import java.sql.SQLException;
import java.sql.Connection;
import javax.sql.DataSource;

import oracle.jdbc.pool.*;
import java.io.*;
import java.util.*;

public class DBInitServlet extends HttpServlet implements Servlet {

 public void destroy() {

  super.destroy();

 }

 public void init() throws ServletException {

  super.init();

  try {
   InputStream is = getClass().getResourceAsStream("/tw/idv/idealist/resources/Database.properties");
   Properties p = new Properties();
   p.load(is);

   OracleDataSource ds = new OracleConnectionPoolDataSource ();
   ds.setDriverType(p.getProperty("oracle.drivertype"));
   ds.setServerName(p.getProperty("oracle.server"));
   ds.setPortNumber(Integer.parseInt(p.getProperty("oracle.port")));
   ds.setDatabaseName(p.getProperty("oracle.database"));
   ds.setUser(p.getProperty("oracle.user"));
   ds.setPassword(p.getProperty("oracle.password"));

   ConnectionPool.init(ds);
   is.close();
  } catch (SQLException e) {
   e.printStackTrace();
   throw new ServletException("Unable to open datasource.");
  }
  catch (IOException ie) {
   ie.printStackTrace();
   throw new ServletException("Unable to open datasource.");
  }
 }
}

Database.properties
oracle.drivertype=thin
oracle.server=dbserver
oracle.port=1521
oracle.database=db3
oracle.user=test
oracle.password=pwd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`ConnectionPool`是Redis官方Python客户端redis-py中的一个类,用于管理Redis客户端连接的连接池。通过连接池,我们可以避免每次操作Redis时都重新建立连接,从而提高Redis的性能和可靠性。具体来说,连接池可以做到以下几点: 1. 连接复用:在连接池中,Redis客户端连接是被重复使用的,不需要每次操作都重新连接Redis服务器,从而节省了连接建立和断开的时间和资源。 2. 连接管理:连接池可以管理连接的创建、销毁、空闲等状态,以便于更好地控制连接的数量和状态,防止连接过多或者过少。 3. 连接可靠性:连接池可以通过心跳机制、重连机制等方式保证连接的可靠性,防止连接丢失或者超时。 在使用redis-py进行Redis操作时,我们通常会先创建一个`ConnectionPool`对象,然后通过该对象创建一个`Redis`对象,最终使用`Redis`对象来执行Redis操作。例如: ```python import redis pool = redis.ConnectionPool(host='localhost', port=6379, db=0) r = redis.Redis(connection_pool=pool) r.set('foo', 'bar') print(r.get('foo')) ``` 在上面的代码中,我们先创建了一个连接池对象`pool`,指定了Redis服务器的地址、端口和数据库编号。然后我们通过`pool`对象创建了一个Redis客户端对象`r`,并使用`set()`方法向Redis服务器中写入了一个键值对。最后我们使用`get()`方法读取Redis服务器中的数据,并打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值