利用weblogic的POOL(連線池)連線資料庫 阿新 • • 發佈:2019-02-02 以往用JAVA存取資料庫都是直接用JDBC連線資料庫; 一般的,每個資料庫客戶端應用程式都要開啟一個或一個以上的資料庫連線, 而在weblogic下我們可以利用weblogic提供的POOL來存取資料庫, 使每個資料庫客戶端共同分享一個或一個以上的資料庫連線, 從而可以提高程式的執行效率和減輕資料庫伺服器的負擔。 這篇文章主要討論的是伺服器的配置和程式碼的實現,在這裡在下不想討論太多POOL的概念和特點, 至於POOL的概念及原理,我建議大家看看一篇題為“用連線池提高Servlet訪問資料庫的效率”的資料,作者是好兵。 本文以Weblogic 5.1+mysql 為例向大家介紹weblogic提供的POOL, 我分別寫了兩個 servlet 作為對照的例子,一個是用 mysql 提供的JDBC來直接存取MYSQL, 另一個是weblogic提供的POOL來存取資料庫。 首先請看用 mysql 提供的JDBC來直接存取MYSQL的程式碼: myjdbc.java ----------------------------------------------------------------------------- import java.io.*; import java.sql.*; import weblogic.db.jdbc.*; import java.util.Properties; import javax.servlet.*; import javax.servlet.http.*; public class myjdbc extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html><head><title>Hello World!</title></head>"); out.println("<body><h1>TEST JDBC!</h1><pre>"); Connection Conn = null; try { //================================================================================= Class.forName("org.gjt.mm.mysql.Driver").newInstance(); Conn = DriverManager.getConnection("jdbc:mysql://localhost/zjws?user=zjxyz&password=xyz"); //================================================================================= Statement Stmt = Conn.createStatement(); ResultSet RS = Stmt.executeQuery("SELECT * from users"); while (RS.next()) { out.println(RS.getString("userid")+"/t" +RS.getString("passwd") +"/t"+RS.getString("name")); } RS.close(); Stmt.close(); Conn.close(); }catch (Exception E) { System.err.println("Unable to load driver."); E.printStackTrace(); } out.println("</pre></body></html>"); } } 上面的程式碼功能是把mysql 的 zjws資料庫裡面 users 表列出來,我把裝入JDBC驅動的語句做了標記 下面是利用POOL讀取資料庫,裝入JDBC驅動的語句我也做了標記,請仔細比較。 首先是要配置好伺服器,在weblogic.properties加入, #===================================================== weblogic.jdbc.connectionPool.mysqlPool1=/ url=jdbc:mysql://localhost/zjws?user=zjxyz,/ driver=org.gjt.mm.mysql.Driver,/ loginDelaySecs=1,/ initialCapacity=4,/ maxCapacity=10,/ capacityIncrement=2,/ allowShrinking=true,/ shrinkPeriodMins=15,/ refreshMinutes=10,/ allow=guest,/ props=user=zjxyz;password=xyz;server=zjxyz #===================================================== 把mysql 的JDBC驅動放在 /weblogic/myserver/serverclasses/ 目錄下,不知為何, 我把jar包把放在其目錄下,把路徑加入 classpath 中,結果啟動時說找不到class, 所以我只好解開的org目錄及其裡面的檔案放進去,結果可以了。 mysql一定要比weblogic先啟動,因為weblogic在啟動時要建立POOL。 mysqlpool.java -------------------------------------------------------------------------------------------------- import java.io.*; import java.sql.*; import weblogic.db.jdbc.*; import java.util.Properties; import javax.servlet.*; import javax.servlet.http.*; public class mysqlpool extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html><head><title>Hello World!</title></head>"); out.println("<body><h1>TEST Weblogic Pool!</h1><pre>"); Connection Conn = null; try { //================================================================================= Properties props =new Properties(); props.setProperty("user", "system"); props.setProperty("password", "zjxyzken"); Driver myDriver = (Driver) Class.forName("weblogic.jdbc.pool.Driver").newInstance(); Conn = myDriver.connect("jdbc:weblogic:pool:mysqlPool1",props); //================================================================================= Statement Stmt = Conn.createStatement(); ResultSet RS = Stmt.executeQuery("SELECT * from users"); while (RS.next()) { out.println(RS.getString("userid")+"/t" +RS.getString("passwd") +"/t"+RS.getString("name")); } RS.close(); Stmt.close(); Conn.close(); }catch (Exception E) { System.err.println("Unable to load driver."); E.printStackTrace(); } out.println("</pre></body></html>"); } } 經過閱讀原始碼,我們可以發現,作為程式設計師某定程度上根本不需要理會伺服器裝的是什麼SQL資料庫, 只需連線到weblogic建立提供的POOL就可以了,這樣一來除了可以提高效率外還令到程式碼的可重用性大大提高。