概念:數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不再是重新建立一個(gè)連接;釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫(kù)連接,以避免因?yàn)闆]有釋放數(shù)據(jù)庫(kù)連接而引起的數(shù)據(jù)庫(kù)連接遺漏。 需要注意: 1. 最小連接數(shù)是連接池一直保持的數(shù)據(jù)庫(kù)連接,所以如果應(yīng)用程序?qū)?shù)據(jù)庫(kù)連接的使用量不大,將會(huì)有大量數(shù)據(jù)庫(kù)連接資源被浪費(fèi)。 2. 最大連接數(shù)是連接池能申請(qǐng)的最大連接數(shù),如果數(shù)據(jù)庫(kù)連接請(qǐng)求超過此數(shù),后面的數(shù)據(jù)庫(kù)連接請(qǐng)求將被加入到等待隊(duì)列中,這會(huì)影響之后的數(shù)據(jù)庫(kù)操作。 數(shù)據(jù)庫(kù)連接池的兩個(gè)任務(wù): 1. 限制每個(gè)應(yīng)用或系統(tǒng)可以擁有的最大資源,也就是確定連接池的大?。≒oolSize)。 2. 在連接池的大?。≒oolSize)范圍內(nèi)、最大限度地使用資源,縮短數(shù)據(jù)庫(kù)訪問的使用周期。 例如: 物理連接數(shù)200個(gè),每個(gè)連接提供250個(gè)Statemet,那么并發(fā)的Statement總數(shù)為200*250=50000個(gè)。 Java開源連接池: Jakarta DBCP 可直接在應(yīng)用程序中使用。(比較常用,集成在Tomcat和Struts中) C3P0是Hibernate的默認(rèn)數(shù)據(jù)庫(kù)連接池。(常用,Hibernate) 其他的還有Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager。 DBCP代碼實(shí)現(xiàn): //創(chuàng)建數(shù)據(jù)源 public static DataSource setupDataSource(String connectURI) { BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName(org.gjt.mm.mysql.Driver); ds.setUsername("username"); ds.setPassword("password"); ds.setUrl(connectURI); return ds; } //關(guān)閉數(shù)據(jù)源 public static void shutdownDataSource(DataSource ds) throws SQLException { BasicDataSource bds = (BasicDataSource)ds; bds.close(); } //數(shù)據(jù)源的使用 DataSource dataSource = getDataSource(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = dataSource.getConnection(); pstmt = conn.prepareStatement("select * from users"); rs = pstmt.executeQuery(); while(rs.next()) { System.out.println(rs.getInt("id")); } } catch(Exception e) { e.printStackTrace(); } finally { try { rs.close(); pstmt.close(); conn.close(); } catch(Exception ex) { ex.printStackTrace(); } } 在Tomcat中配置數(shù)據(jù)庫(kù)連接池: 我們使用Tomcat中l(wèi)ib文件夾下的tomcat-dbcp.jar。 1. 修改server.xml文件在<Service>中寫入以下代碼: <Context path="/WebProject" docBase="WebProject" reloadable="true" crossContext="true"> <Resource auth="Container" name="jdbc/CompanyDB" type="javax.sql.DataSource" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DataBaseName=Company" username="sa" password="root" maxActive="100" maxIdle="30" maxWait="10000" removeAbandoned=“true” removeAbandonedTimeOut="10" logAbandoned="true"/> </Context> path:工程路徑。 docBase:工程名字。 name:JNDI的名字。 type:數(shù)據(jù)源的類。 factory:指定生成的DataReource的factory類名;默認(rèn)DBCP工廠類。 driverClassName:數(shù)據(jù)庫(kù)驅(qū)動(dòng)名。 url:數(shù)據(jù)庫(kù)連接的URL。 username:數(shù)據(jù)庫(kù)用戶名。 password:數(shù)據(jù)庫(kù)密碼。 maxActive:最大連接數(shù)據(jù)庫(kù)數(shù),設(shè)為0表示沒有限制。 maxIdle:最大等待數(shù)量,設(shè)為0表示沒有限制。 maxWait:最大等待秒數(shù),單位為ms。 removeAbandoned:是否自我中斷,默認(rèn)為false。 removeAbandonedTimeOut:幾秒后會(huì)自我中斷,removeAbandoned必須為true。 logAbandoned:是否記錄中斷事件,默認(rèn)為false。 2. 修改web.xml文件,增加一個(gè)標(biāo)簽,輸入以下代碼: <resource-ref> <description>Company Connection</description> <res-ref-name>jdbc/CompanyDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> res-ref-name:指定JNDI的名字。 res-type:指定資源類名。 res-auth:指定資源的Manager。 3. 代碼中使用JNDI代碼進(jìn)行獲?。?span id="lcf9zs3" class=Apple-converted-space> Context ctx = new InitalContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/CompanyDB"); Connection conn = ds.getConnection(); 注意:java:comp/env/ 是java中JNDI固定寫法。 |
|
來(lái)自: 燮羽 > 《數(shù)據(jù)庫(kù)》