2017-04-07 217 views
-1

我有一個在Tomcat中運行的Web應用程序,它通過一個DataSource連接到一個Oracle數據庫。我一直在處理一些奇怪的行爲,因爲即使沒有用戶連接並且一旦應用程序啓動,連接池也會變滿!當我檢查正在執行的查詢它總是似乎是相同的:此查詢來自哪裏?

select value$ from props$ where name = 'global_db_name' 

用於連接的背景是這樣的:

<Context antiResourceLocking="true" crossContext="true" path="/taquillas"> 
    <Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver" 
       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
       jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" 
       jmxEnabled="true" url="jdbc:oracle:thin:@yyy.yyy.yyy.yyy:zzzz:ANNI" 
       username="xxxxxxxxx" name="jdbc/andrea" password="xxxxxxx" 
       type="javax.sql.DataSource" validationInterval="30000" 
       maxActive="50" minIdle="1" maxWait="10000" defaultAutoCommit="false" 
       initialSize="1" removeAbandonedTimeout="60" 
       removeAbandoned="true" validationQuery="SELECT 1 FROM DUAL"/> 
</Context> 

而數據源是這樣的:

public dbutilsHandler() 
      throws ClassNotFoundException, SQLException, NamingException { 
     this.gson = new GsonBuilder() 
       .setDateFormat("yyyy-MM-dd") 
       .serializeNulls().create(); 
     InitialContext cxt; 
     cxt = new InitialContext(); 
     this.ds = (DataSource) cxt.lookup("java:/comp/env/jdbc/andrea"); 
     this.query = new QueryRunner(ds); 
     this.con = this.query.getDataSource().getConnection(); 
    } 

我在確保沒有連接打開,但我仍然不明白爲什麼會發生。幫幫我!

+3

我們不知道這是什麼代碼是,當它的名字,或任何東西。我們只能說它不尊重Java命名約定,而是打開了一個連接但沒有關閉它。 –

+1

你如何識別SQL(快速谷歌建議是常見的背景噪音)作爲罪魁禍首;以及你如何確定連接池已滿 - 這是什麼意思,它有50個連接,或不會再打開?什麼代碼出錯了,你實際得到了什麼錯誤?應用程序在啓動時做了什麼? –

回答

0

prop$是SYS表。它保存數據庫屬性的值,如DEFAULT_TEMP_TABLESPACENLS_LANG和是,GLOBAL_DB_NAMEFind out more

你提到的查詢...

select value$ from props$ where name = 'global_db_name' 

...是遞歸的SQL,這意味着它是由Oracle生成的應用程序支持的SQL語句的內部。據傳這似乎與流氓跟蹤過程,所以它的價值檢查你是否有一個系統級觸發器執行這樣的事情:

alter system set events ‘10046 trace name context forever,level 12’;