All About JAVA 關於資料庫ORACLE驅動包中OracleConnectionPoolDataSource串連池的使用方法

來源:互聯網
上載者:User

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的兩個變數 }}

 關於串連池這塊兒要是有什麼更好更靈活的方法希望一定要留言告訴我啊。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.