2017-04-07 89 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’;