2016-07-01 5 views
-1

私はこの問題を抱えています:JavaアプリケーションからSQLパフォーマンスを向上させる方法

私はJavaで開発された古いアプリケーション(Springフレームワーク)を持っています。問題はSQLのクエリです.Sql Developerからの処理とは異なり、Javaアプリケーションから実行すると時間がかかります。 Javaから約7分かかります。 SQL Developerからは30秒かかります。どちらの場合もクエリは同じです。

アプリケーションの設定は次のとおりです。

  • JDK 1.6
  • OJDBC 6
  • Springフレームワーク3.6
  • Oracleの11グラムのEnterprise Editionリリース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> 

最後に、私はIBATIS 2.3をSQLマッピングに使用しています。

私はテストデバッグを行い、DAOクラスがIbatisマップ(クエリ)を呼び出すと、パフォーマンスが遅くなることがあります。

いくつかお手伝いしますか?

私の英語のために残念です。

よろしく

アップデート1:

クエリ:

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 PAG.PAG_FECHA >= TO_DATE('20160501','YYYYMMDD') AND PAG.PAG_FECHA <= TO_DATE('20160503','YYYYMMDD') 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

アップデート2:ここでのiBATISの設定です:

<?xml version="1.0" encoding="UTF-8"?> 

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

iBatisのマップの設定:

<!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> 
+0

質問は非常に一般的であり、少なくともいくつかの詳細を提供する必要があります。任意の形式でキャッシュを使用していますか?あなたはDBインデックスを作成しようとしましたか? – Christian

+0

クエリはどこですか? –

+0

問題のあるクエリを調整する場合は、質問に追加してください。 – krokodilko

答えて

1

あなたの選択に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ドライバのデフォルト値は非常に低いため、サーバーとの間で多くのトラフィックが発生します。

+0

答えてくれてありがとう、私は試しましたが、パフォーマンスを改善していません。 – waridc

+0

平凡なJDBCを使ってJavaからクエリを実行しようとしましたか? – kbolino

関連する問題