九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Tomcat 7 的新JDBC連接池的使用說明

Tomcat 7 的JDBC連接池實現(xiàn)類為org.apache.tomcat.jdbc.pool,作為替換commons-dbcp的方案。

替換commons-dbcp的原因如下:

  1. commons-dbcp是單線程的,為了線程安全,就要瑣住整個連接池,查詢驗證階段也要瑣住整個連接池。

  2. commons-dbcp速度慢,性能差,多CPU的環(huán)境下單線程運行,不支持高并發(fā),在JAVA 6中也不能解決速度和并發(fā)的問題。

  3. commons-dbcp實現(xiàn)復雜,超過60個類。tomcat-jdbc-pool核心只有8個類,修改更加簡單,只需運行連接池本身,易測試。

  4. commons-dbcp應(yīng)用靜態(tài)接口,就意味著并不能用JDK 1.6編譯它,在JDK 1.6/1.7中運行時,即使驅(qū)動程序支持,所有沒有實現(xiàn)的方法也都會拋出NoSuchMethodException異常。

  5. commons-dbcp幾乎停滯,很少更新。

  6. 作為一個連接池的簡單實現(xiàn)不值得重寫超過60個類。

  7. Tomcat jdbc連接池實現(xiàn)了一個commons-dbcp沒有的公平算法,并且比commons-dbcp性能更好。

  8. Tomcat jdbc連接池實現(xiàn)了異步獲取連接,也不需增加額外的線程。

  9. Tomcat jdbc連接池是一個Tomcat的模塊,依賴于Tomcat JULI(Tomcat日志框架)

  10. 使用javax.sql.PooledConnection接口獲取連接。

  11. 饑餓算法。如果連接池空了,同時一個線程要獲得連接,當一個連接返回到連接池,連接池會將正確的線程喚醒。

除了commons-dbcp連接池,還有其它可以選擇的方案,如c3p0,bonecp等,與這些連接池實現(xiàn)相比,Tomcat jdbc pool更突出的功能體現(xiàn)在:

  1. 支持多核系統(tǒng),提供更好的高并發(fā)性能。

  2. 接口動態(tài)實現(xiàn),運行時環(huán)境支持java.sqljavax.sql接口,可以使用低版本JDK編譯。

  3. 無需每次使用連接時都驗證連接,可以在獲取或返回連接時驗證,不用比設(shè)置的間隔時間更頻繁。

  4. 當數(shù)據(jù)庫連接建立時,一個可設(shè)置的查詢將運行一次。這對保持連接建立整個時間中的會話十分有用。

  5. 可以自定義攔截器增強功能??啥x攔截器來收集查詢統(tǒng)計,緩存會話狀態(tài),重新連接,重新查詢,緩存查詢結(jié)果等。

  6. 高性能

  7. 極其簡單,由于非常簡單的實現(xiàn),源程序行數(shù)和文件數(shù)很少,相比c3p0的200多個源程序文件,Tomcat jdbc只有8個核心源文件,關(guān)于連接池的部分只有4個文件。這樣更容易追溯和修改Bug。減少復雜性就是起初開發(fā)的一個焦點。

  8. 異步獲取連接,可將連接請求形成隊列,系統(tǒng)返回Future<Connection>

  9. 更好的空閑連接處理,應(yīng)用更優(yōu)化的算法調(diào)整連接池大小和連接的釋放。

  10. 用戶來決定當連接池滿了在什么時刻釋放連接,或者直接設(shè)置一個超時的閥值。

  11. 釋放連接定時器將會在查詢時重置。允許一個使用很長時間的連接不超時。這個功能由ResetAbandonedTimer完成。

  12. 在連接一定長時間后關(guān)閉連接。時間與返回連接池的時間相似。

  13. 當連接要被釋放時,將得到JMX通知并且記錄整個日志。這和removeAbandonedTimeout相似,但是只輸出信息,不做任何操作。使用suspectTimeout屬性完成設(shè)置。

  14. 可以從java.sql.Driver,javax.sql.DataSource或者javax.sql.XADataSource中取得連接,使用dataSourcedataSourceJNDI屬性完成。

  15. 支持XA連接。

如何使用

Java代碼 
  1. import java.sql.Connection;  

  2. import java.sql.ResultSet;  

  3. import java.sql.Statement;  

  4. import org.apache.tomcat.jdbc.pool.DataSource;  

  5. import org.apache.tomcat.jdbc.pool.PoolProperties;  

  6. public class SimplePOJOExample {  

  7.     public static void main(String[] args) throws Exception {  

  8.         PoolProperties p = new PoolProperties();  

  9.         p.setUrl("jdbc:mysql://localhost:3306/mysql");  

  10.         p.setDriverClassName("com.mysql.jdbc.Driver");  

  11.         p.setUsername("root");  

  12.         p.setPassword("password");  

  13.         p.setJmxEnabled(true);  

  14.         p.setTestWhileIdle(false);  

  15.         p.setTestOnBorrow(true);  

  16.         p.setValidationQuery("SELECT 1");  

  17.         p.setTestOnReturn(false);  

  18.         p.setValidationInterval(30000);  

  19.         p.setTimeBetweenEvictionRunsMillis(30000);  

  20.         p.setMaxActive(100);  

  21.         p.setInitialSize(10);  

  22.         p.setMaxWait(10000);  

  23.         p.setRemoveAbandonedTimeout(60);  

  24.         p.setMinEvictableIdleTimeMillis(30000);  

  25.         p.setMinIdle(10);  

  26.         p.setLogAbandoned(true);  

  27.         p.setRemoveAbandoned(true);  

  28.         p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+  

  29.                   "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");  

  30.         DataSource datasource = new DataSource();  

  31.         datasource.setPoolProperties(p);  

  32.         Connection con = null;  

  33.         try {  

  34.             con = datasource.getConnection();  

  35.             Statement st = con.createStatement();  

  36.             ResultSet rs = st.executeQuery("select * from user");  

  37.             int cnt = 1;  

  38.             while (rs.next()) {  

  39.                 System.out.println((cnt++)+". Host:" +rs.getString("Host")+  

  40.                 " User:"+rs.getString("User")+" Password:"+rs.getString("Password"));  

  41.             }  

  42.             rs.close();  

  43.             st.close();  

  44.         } finally {  

  45.             if (con!=null) try {con.close();}catch (Exception ignore) {}  

  46.         }  

  47.     }  

  48. }  

 
 

作為數(shù)據(jù)源在Tomcat中使用

<resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" testwhileidle="true" testonborrow="true" testonreturn="false" validationquery="SELECT 1" validationinterval="30000" timebetweenevictionrunsmillis="30000" maxactive="100" minidle="10" maxwait="10000" initialsize="10" removeabandonedtimeout="60" removeabandoned="true" logabandoned="true" minevictableidletimemillis="30000" jmxenabled="true" jdbcinterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" username="root" password="password" driverclassname="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mysql"> 2 </resource>

 異步獲取連接1.必須將fairQueue設(shè)置為true
2.必須將數(shù)據(jù)源轉(zhuǎn)換為org.apache.tomcat.jdbc.pool.DataSource

Connection con = null; try { Future future = datasource.getConnectionAsync(); while (!future.isDone()) { System.out.println("Connection is not yet available. Do some background work"); try { Thread.sleep(100); //simulate work }catch (InterruptedException x) { Thread.currentThread().interrupted(); } } con = future.get(); //should return instantly Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from user");

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JNDI Spring獲取配置數(shù)據(jù)源的三種方法
Tomcat 5.5 配置 MySQL 數(shù)據(jù)庫連接池
JDBC-數(shù)據(jù)連接池的使用
《Tomcat4.1.31的數(shù)據(jù)庫連接池配置》
在Tomcat配置JNDI數(shù)據(jù)源的三種方式
JAVA數(shù)據(jù)庫連接方式匯總
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服