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的兩個變數 }}
關於串連池這塊兒要是有什麼更好更靈活的方法希望一定要留言告訴我啊。