如何提高Java应用程序的SQL性能

如何提高Java应用程序的SQL性能,java,sql,spring,oracle,jdbc,Java,Sql,Spring,Oracle,Jdbc,我有一个问题: 我有一个用JavaSpring框架开发的大型应用程序。问题是,当我从Java应用程序执行sql查询时,需要花费很长时间,而不是从sql Developer执行查询。 从Java开始大约需要7分钟。从SQLDeveloper开始,需要30秒。两种情况下的查询相同 应用程序配置为: JDK1.6 OJDBC 6 Spring框架3.6 Oracle 11g企业版11.2.0.3.0版 数据源配置: <bean id="dataSource" class="com.mchange

我有一个问题:

我有一个用JavaSpring框架开发的大型应用程序。问题是,当我从Java应用程序执行sql查询时,需要花费很长时间,而不是从sql Developer执行查询。 从Java开始大约需要7分钟。从SQLDeveloper开始,需要30秒。两种情况下的查询相同

应用程序配置为:

JDK1.6 OJDBC 6 Spring框架3.6 Oracle 11g企业版11.2.0.3.0版 数据源配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>
    <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
    <property name="minPoolSize" value="${jdbc.minPoolSize}"/>
</bean>
最后,我将使用iBATIS2.3进行sql映射

我做了一个测试调试,当DAO类调用Ibatis映射时,查询就是性能开始变慢的时候

要帮忙吗

对不起我的英语

问候

更新1:

查询:

选择PAG.ID_PAG作为ID_PAG,选择CAD.CAD_NOMBRE作为CAD_NOMBRE, LOC.LOC_NOMBRE为LOC_NOMBRE,EMI.EMI_CODIGO为EMI_CODIGO, EMI.EMI_NOMBRE作为EMI_NOMBRE, 将“DD/MM/yyyyy”作为TRX_FECHA发送至_CHARPAG.PAG_FECHA, PAG.PAG_POS作为TRX_POS,RTRIMPAG.PAG_compobante作为TRX_compobante, 1作为康蒂达,PAG.PAG_MONTO作为TRX_MONTO, PAG.PAG_COMISION_总计为MONTO_COMISION,PAG.PAG_NETO_总计为MONTO_NETO 来自帕果帕格、帕果帕格当地LOC、帕果帕格EMI、, CADENA CAD,TIPOTRX,EMI TTE 其中CAD.ID_CADENA=PAG.ID_CADENA和EMI.ID_emissor=PAG.ID_emissor 和LOC.ID_LOCAL=PAG.ID_LOCAL 和PAG.ID_TIPOTRX_EMI=TTE.ID_TIPOTRX_EMI 和PAG.PAG_FLAG_commision='S' 和PAG.PAG_FECHA>=截至日期'20160501','YYYYMMDD' 和PAG.PAG_FECHA将select上的fetchSize参数设置为较大的值,例如1000:

<select id="getPagosComisionesSinGrupoDetalle"
    resultMap="getPagosComisionesSinGrupoDetalle"
    parameterClass="cl.bbr.portalweb.dto.InformePagosComisionesSearchCriteria"
    fetchSize="1000">
SELECT  PAG.ID_PAG AS ID_PAG, CAD.CAD_NOMBRE AS CAD_NOMBRE, LOC.LOC_NOMBRE AS LOC_NOMBRE,  EMI.EMI_CODIGO AS EMI_CODIGO,EMI.EMI_NOMBRE AS EMI_NOMBRE, TO_CHAR(PAG.PAG_FECHA, 'DD/MM/YYYY') AS TRX_FECHA, PAG.PAG_POS AS TRX_POS, RTRIM(PAG.PAG_COMPROBANTE) AS TRX_COMPROBANTE, 1 AS CANTIDAD,PAG.PAG_MONTO AS TRX_MONTO, PAG.PAG_COMISION_TOTAL AS MONTO_COMISION,PAG.PAG_NETO_TOTAL AS MONTO_NETO FROM PW_PAGO PAG, PW_LOCAL LOC,PW_EMISOR EMI, PW_CADENA CAD, PW_TIPOTRX_EMI TTE WHERE CAD.ID_CADENA =PAG.ID_CADENA AND EMI.ID_EMISOR = PAG.ID_EMISOR AND LOC.ID_LOCAL = PAG.ID_LOCAL        AND PAG.ID_TIPOTRX_EMI = TTE.ID_TIPOTRX_EMI AND PAG.PAG_FLAG_COMISION = 'S'              AND <![CDATA[PAG.PAG_FECHA >= #f_ini#]]> AND <![CDATA[PAG.PAG_FECHA <= #f_fin#]]> ORDER BY CAD.CAD_NOMBRE, LOC.LOC_NOMBRE, EMI.EMI_NOMBRE, TO_CHAR(PAG.PAG_FECHA, 'DD/MM/YYYY'), PAG.PAG_POS, PAG.PAG_COMPROBANTE, PAG.PAG_MONTO
</select>

Oracle JDBC驱动程序的默认值非常低,因此服务器之间存在大量来回通信。

问题非常普遍,您至少应该提供一些详细信息。您是否以任何形式使用缓存?您是否尝试过创建DB索引?查询在哪里?如果您想优化有问题的查询,请将其附加到问题中。请包括Ibatis映射xml和映射类。所有这些点是否有助于提高Java中的查询时间?为什么SQL developer的速度要快得多?从应用程序开始30秒到7分钟@AleksGThanks为了回答这个问题,我尝试过,但它并没有提高@kbolinof的性能,或者说,为了理智起见,您是否尝试过使用普通JDBC从Java运行查询?
<resultMap id="getPagosComisionesSinGrupoDetalle"
           class="cl.bbr.portalweb.dto.InformePagosComisionesSinGrupoDetalleDTO" >

    <result column="ID_PAG"             property="id_pag"           jdbcType="INTEGER" />
    <result column="CAD_NOMBRE"         property="cad_nombre"       jdbcType="VARCHAR" />
    <result column="LOC_NOMBRE"         property="loc_nombre"       jdbcType="VARCHAR" />
    <result column="EMI_CODIGO"         property="emi_codigo"       jdbcType="VARCHAR" />
    <result column="EMI_NOMBRE"         property="emi_nombre"       jdbcType="VARCHAR" />       
    <result column="TRX_FECHA"          property="trx_fecha"        jdbcType="DATE" />
    <result column="TRX_POS"            property="trx_pos"          jdbcType="VARCHAR" />
    <result column="TRX_COMPROBANTE"    property="trx_comprobante"  jdbcType="VARCHAR" />
    <result column="CANTIDAD"           property="cantidad"         jdbcType="INTEGER" />
    <result column="TRX_MONTO"          property="trx_monto"        jdbcType="DECIMAL" />
    <result column="MONTO_COMISION"     property="monto_comision"   jdbcType="DECIMAL" />
    <result column="MONTO_NETO"         property="monto_neto"       jdbcType="DECIMAL" />
</resultMap>

<!-- Obtiene datos comisiones sin grupo y con detalle-->
<select id="getPagosComisionesSinGrupoDetalle"
        resultMap="getPagosComisionesSinGrupoDetalle"
        parameterClass="cl.bbr.portalweb.dto.InformePagosComisionesSearchCriteria">
    SELECT  PAG.ID_PAG AS ID_PAG, CAD.CAD_NOMBRE AS CAD_NOMBRE, LOC.LOC_NOMBRE AS LOC_NOMBRE,  EMI.EMI_CODIGO AS EMI_CODIGO,EMI.EMI_NOMBRE AS EMI_NOMBRE, TO_CHAR(PAG.PAG_FECHA, 'DD/MM/YYYY') AS TRX_FECHA, PAG.PAG_POS AS TRX_POS, RTRIM(PAG.PAG_COMPROBANTE) AS TRX_COMPROBANTE, 1 AS CANTIDAD,PAG.PAG_MONTO AS TRX_MONTO, PAG.PAG_COMISION_TOTAL AS MONTO_COMISION,PAG.PAG_NETO_TOTAL AS MONTO_NETO FROM PW_PAGO PAG, PW_LOCAL LOC,PW_EMISOR EMI, PW_CADENA CAD, PW_TIPOTRX_EMI TTE WHERE CAD.ID_CADENA =PAG.ID_CADENA AND EMI.ID_EMISOR = PAG.ID_EMISOR AND LOC.ID_LOCAL = PAG.ID_LOCAL        AND PAG.ID_TIPOTRX_EMI = TTE.ID_TIPOTRX_EMI AND PAG.PAG_FLAG_COMISION = 'S'              AND <![CDATA[PAG.PAG_FECHA >= #f_ini#]]> AND <![CDATA[PAG.PAG_FECHA <= #f_fin#]]> ORDER BY CAD.CAD_NOMBRE, LOC.LOC_NOMBRE, EMI.EMI_NOMBRE, TO_CHAR(PAG.PAG_FECHA, 'DD/MM/YYYY'), PAG.PAG_POS, PAG.PAG_COMPROBANTE, PAG.PAG_MONTO
    </select>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig>
<settings useStatementNamespaces="true"/> 
<sqlMap resource="cl/bbr/portalweb/dao/ibatis/maps/oracle/FINDER_INFORME_PAGOS_COMISIONES_SqlMap.xml"/> </sqlMapConfig>
<select id="getPagosComisionesSinGrupoDetalle"
    resultMap="getPagosComisionesSinGrupoDetalle"
    parameterClass="cl.bbr.portalweb.dto.InformePagosComisionesSearchCriteria"
    fetchSize="1000">
SELECT  PAG.ID_PAG AS ID_PAG, CAD.CAD_NOMBRE AS CAD_NOMBRE, LOC.LOC_NOMBRE AS LOC_NOMBRE,  EMI.EMI_CODIGO AS EMI_CODIGO,EMI.EMI_NOMBRE AS EMI_NOMBRE, TO_CHAR(PAG.PAG_FECHA, 'DD/MM/YYYY') AS TRX_FECHA, PAG.PAG_POS AS TRX_POS, RTRIM(PAG.PAG_COMPROBANTE) AS TRX_COMPROBANTE, 1 AS CANTIDAD,PAG.PAG_MONTO AS TRX_MONTO, PAG.PAG_COMISION_TOTAL AS MONTO_COMISION,PAG.PAG_NETO_TOTAL AS MONTO_NETO FROM PW_PAGO PAG, PW_LOCAL LOC,PW_EMISOR EMI, PW_CADENA CAD, PW_TIPOTRX_EMI TTE WHERE CAD.ID_CADENA =PAG.ID_CADENA AND EMI.ID_EMISOR = PAG.ID_EMISOR AND LOC.ID_LOCAL = PAG.ID_LOCAL        AND PAG.ID_TIPOTRX_EMI = TTE.ID_TIPOTRX_EMI AND PAG.PAG_FLAG_COMISION = 'S'              AND <![CDATA[PAG.PAG_FECHA >= #f_ini#]]> AND <![CDATA[PAG.PAG_FECHA <= #f_fin#]]> ORDER BY CAD.CAD_NOMBRE, LOC.LOC_NOMBRE, EMI.EMI_NOMBRE, TO_CHAR(PAG.PAG_FECHA, 'DD/MM/YYYY'), PAG.PAG_POS, PAG.PAG_COMPROBANTE, PAG.PAG_MONTO
</select>