这个查询来自哪里?

时间:2017-04-07 22:54:46

标签: java oracle tomcat datasource apache-commons-dbutils

我有一个在Tomcat中运行的Web应用程序,它通过DataSource连接到Oracle DB。我一直在处理一些奇怪的行为,因为即使没有用户连接并且应用程序启动后,连接池也会变满!当我检查正在执行的查询时,它总是看起来是相同的:

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

Connection的上下文是:

<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>

DataSource就像这样:

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();
    }

我确保没有任何连接被打开,但我仍然不明白为什么会发生这种情况。救命!

1 个答案:

答案 0 :(得分: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’;