2011-09-28 注,在oracle网站发现这篇文章写到的方法已经不再赞成被使用,参见:http://download.oracle.com/docs/cd/B12037_01/java.101/b10979/conncache.htm
第三方的一个应用系统使用的是SQLSERVER数据库,根据客户需求需要将其纳入现存系统中统一管理,并更换为ORACLE数据库,我们提供相关支持。先就是要求提供一个更改为使用ORACLE数据库的方案,并将数据库连接池纳入其中。第三方应用中使用了自定义的数据结构来存储从数据库中返回的数据。根据以上情况写了一个简单的数据库连接解决方案的DEMO,供第三方使用。DEMO一共3个类PoolDbSource // 管理连接池对象包括获取连接方法的类。BaseManager // 使用PoolDbSource 获取的连接进行数据库操作封装的类。ConnectionPoolTestAction // struts1.2的Action类。
参考文章:http://download.oracle.com/docs/cd/A97630_01/java.920/a96654/connpoca.htm
Demo中引入的ORACLE的数据库驱动的包,其中有我们要使用的实现了数据库连接池的类 OracleConnectionPoolDataSource ,需要到ORACLE网站根据自身使用的数据库版本进行下载(点击打开链接)。代码如下:
PoolDbSource 类
package com.***.connectionpool.db;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.PooledConnection;
import oracle.jdbc.pool.*;
public class PoolDbSource
{
private static PoolDbSource instance;
private OracleConnectionPoolDataSource ocpds;
private PoolDbSource() throws SQLException{
ocpds = new OracleConnectionPoolDataSource();
ocpds.setDriverType("thin");
ocpds.setServerName("202.112.119.177");
ocpds.setNetworkProtocol("tcp");
ocpds.setDatabaseName("orcl");
ocpds.setPortNumber(1521);
ocpds.setUser("idc_yjs");
ocpds.setPassword("yjs");
}
/**
* 返回唯一实例.如果是第一次调用此方法,则创建实例
*
* @return PoolDbSource 唯一实例
* @throws SQLException
*/
static synchronized public PoolDbSource getInstance()
{
if (instance == null)
{
synchronized (PoolDbSource.class) // 加锁
{
if(instance == null) // 第二次检查
{
try
{
instance = new PoolDbSource();
}
catch (SQLException e)
{
System.out.print("=================================");
System.out.print("链接数据库失败!");
System.out.print("=================================");
System.out.print("错误信息:");
e.printStackTrace();
return null;
}
}
}
}
return instance;
}
/**
* 取得数据库连接
* @return
*/
public Connection getConnection()
{
PooledConnection pc; // 数据库连接池连接
Connection conn; // 数据库连接对象
try
{
pc = ocpds.getPooledConnection(); // 从连接池获取连接
conn = pc.getConnection();
}
catch (SQLException e)
{
System.out.print("=================================");
System.out.print("获得数据库连接失败!");
System.out.print("=================================");
System.out.print("错误信息:");
e.printStackTrace();
return null;
}
return conn;
}
}
BaseManager 类
package com.***.connectionpool.common;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.***.connectionpool.db.PoolDbSource;
public class BaseManager {
PoolDbSource poolDbSource; //数据源连接管理对象
Connection conn; // 数据库连接对象
public BaseManager()
{
super();
}
/**
* 执行查询语句返回数据集
* @param sql
* @return
*/
public ResultSet executeQuerySql(String sql)
{
Statement statement;
ResultSet rs = null;
try
{
poolDbSource = PoolDbSource.getInstance();
conn = poolDbSource.getConnection();
statement = conn.createStatement();
rs = statement.executeQuery(sql);
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
// if(conn!=null)
// 因为他们有自己的数据结构,所以在这个方
// 法中实际返回的应该是他们的数据结构类型而不是ResultSet,
// 这里返回的是ResultSet所以在这里关闭conn会导致返回的rs无法使用。暂时注释掉了
// {
// try
// {
// conn.close();
// }
// catch (SQLException e)
// {
// System.out.print("关闭数据库连接出现异常。");
// }
// }
}
return rs;
}
}
ConnectionPoolTestAction
package com.***.connectionpool.sources;
import java.sql.ResultSet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.***.connectionpool.common.BaseManager;
public class ConnectionPoolTestAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
BaseManager baseManager = new BaseManager();
ResultSet rs = baseManager.executeQuerySql("SELECT * FROM code_school where xsbz = '0'");
if(rs.next())
{
request.setAttribute("lsh", rs.getString(1));
request.setAttribute("zgh", rs.getString(2));
}
return mapping.findForward("success"); // 返回到一个测试页面读取request.setAttribute的两个变量
}
}
关于连接池这块儿要是有什么更好更灵活的方法希望一定要留言告诉我啊。