TongWeb資料來源原理
TongWeb資料來源原理:通過連線複用減少了建立資料庫連線的次數,提高系統的效能。
這類文章很多,就不再細講了。但在實際使用過程中仍會遇到很多資料來源相關問題,接下來介紹幾個處理資料來源問題常用引數的實現機制。
引數一:洩露超時,列印洩露超時日誌
在應用從TongWeb資料來源獲取資料庫連線時,TongWeb記錄下當前的stack trace資訊,在達到洩露超時時間後,發現該連線還沒有回收到連線池,則認為該連線存在洩露的可能性,並將該stack trace資訊列印出來。所以看到的stack trace資訊是應用獲取連線時的程式碼,此時需要檢查該程式碼在獲取連線後有沒有執行connection.close()關閉連線。
[2020-11-30 09:09:52 601] [WARNING] [testdb jdbc-scheduler] [data-source] [java.lang.Exception: A potential connection leak detected for connection pool testdb
at com.tongweb.hulk.HulkDataSource.getConnection(HulkDataSource.java:66)
at com.tongweb.tongejb.resource.jdbc.DecoratorDS.getConnection(DecoratorDS.java:26)
at com.tongweb.tongejb.resource.jdbc.managed.local.ManagedConnection.newConnection(ManagedConnection.java:208)
at com.tongweb.tw.thanos.ThanosManagedConnection.invoke(ThanosManagedConnection.java:70)
at com.sun.proxy.$Proxy153.createStatement(Unknown Source)
at Test.doGet(Test.java:53) #檢查應用處程式碼有沒有close。
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at com.tongweb.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
at com.tongweb.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at com.tongweb.web.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at com.tongweb.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at com.tongweb.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at com.tongweb.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at com.tongweb.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)
at com.tongweb.catalina.core.ThanosStandardContextValve.invoke(ThanosStandardContextValve.java:108)
at com.tongweb.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
at com.tongweb.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:450)
at com.tongweb.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at com.tongweb.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
at com.tongweb.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at com.tongweb.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at com.tongweb.catalina.core.ThanosStandardEngineValve.invoke(ThanosStandardEngineValve.java:43)
at com.tongweb.catalina.realm.RealmValve.invoke(RealmValve.java:21)
at com.tongweb.catalina.connector.ThanosCoyoteAdaptor.service(ThanosCoyoteAdaptor.java:432)
at com.tongweb.coyote.http11.Http11Processor.service(Http11Processor.java:776)
at com.tongweb.coyote.http11.ThanosHttp11Processor.service(ThanosHttp11Processor.java:19)
at com.tongweb.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at com.tongweb.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:913)
at com.tongweb.web.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1610)
at com.tongweb.web.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at com.tongweb.web.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:842)
at com.tongweb.web.util.net.Nio2Endpoint$Nio2SocketWrapper$4.completed(Nio2Endpoint.java:640)
at com.tongweb.web.util.net.Nio2Endpoint$Nio2SocketWrapper$4.completed(Nio2Endpoint.java:618)
at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
at sun.nio.ch.Invoker$2.run(Invoker.java:218)
at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
at com.tongweb.web.util.threads.TWThreadPoolExecutor.runWorker(TWThreadPoolExecutor.java:1172)
at com.tongweb.web.util.threads.TWThreadPoolExecutor$Worker.run(TWThreadPoolExecutor.java:628)
at com.tongweb.web.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
引數二:"即時洩漏回收” 或 老版本-Dtongweb.resource.leakCheck引數
在應用從TongWeb資料來源獲取資料庫連線時,將資料來源連線記錄在當前http執行緒的ThreadLocal中,當http執行緒處理完請求後,將該執行緒ThreadLocal中記錄的Connection關閉,以此來達到實時關閉連線的目的。該功能僅限TongWeb自身管理執行緒,應用執行緒無法管理。 所以有時還需要結合洩露超時回收一塊處理。
當前應用多采用hibernate、MyBatis框架下本身應不會出現洩露連線的情況,多數是因為SQL執行時間過長,導致的連線佔滿。
引數三:“語句超時”引數
本質上就是設定JDBC的 java.sql.Statement的setQueryTimeout(int seconds) 方法。該方法用於中斷長時間執行的SQL,但是該方法取決於資料庫廠家提供的JDBC驅動包是否支援,並非所有資料庫廠家的JDBC驅動支援該方法,所以該功能並非 100%有效。
引數四:"SQL執行時間過濾" "SQL日誌"引數
大致的記錄過程是記錄statement執行SQL的前後時間差,以此來判斷SQL執行時間,並將大於"SQL執行時間過濾"的SQL語句和執行時間輸出在日誌中,以便來分析SQL效能影響。 但是該時間包含JDBC處理時間,並非等於SQL在資料庫中執行的時間,多數情況該時間大於SQL在資料庫中執行的時間。
long start = System.currentTimeMillis();
Statement.executeQuery(SQl);
long end = System.currentTimeMillis();
log.warn("Slow Query Report SQL="+(end-start));
相關文章
- Spring多資料來源管理實現原理Spring
- jndi資料來源
- 多資料來源與動態資料來源的權衡
- 資料來源連線資料庫資料庫
- SparkSQL外部資料來源SparkSQL
- jndi配置資料來源
- 多資料來源配置
- 東方通中介軟體Tongweb適配瀚高資料庫Web資料庫
- Spring Boot 動態資料來源(Spring 註解資料來源)Spring Boot
- AbstractRoutingDataSource 實現動態資料來源切換原理簡單分析
- MyBatis整合雙資料來源MyBatis
- MyBatis配置多資料來源MyBatis
- web 配置多資料來源Web
- 阿里DRUID資料來源阿里UI
- [FICO資料] 來源網上
- tomcat配置資料來源Tomcat
- 資料來源問題求救
- 連線資料來源(轉)
- 物流資料來源系統
- 資料來源連線池
- 索引重建的資料來源索引
- pip更換資料來源
- Spring系列 之資料來源的配置 資料庫 資料來源 連線池的區別Spring資料庫
- Spring-Boot 多資料來源配置+動態資料來源切換+多資料來源事物配置實現主從資料庫儲存分離Springboot資料庫
- 資料來源(DataSource)是什麼以及SpringBoot中資料來源配置Spring Boot
- Spring多資料來源配置Spring
- SpringBoot多資料來源Spring Boot
- weblogic配置JDBC資料來源WebJDBC
- Spring配置多資料來源Spring
- DataV配置VPC資料來源教程
- tomcat JNDI資料來源配置Tomcat
- 索引重建的資料來源(二)索引
- siebel切換資料來源【轉】
- 談談Spring Boot 資料來源載入及其多資料來源簡單實現Spring Boot
- Spring Boot MyBatis 動態資料來源切換、多資料來源,讀寫分離Spring BootMyBatis
- GridView用資料來源控制元件和用DataTable作為資料來源的不同View控制元件
- 30個類手寫Spring核心原理之動態資料來源切換Spring
- ODBC 常見資料來源配置整理