sql >> データベース >  >> RDS >> Oracle

Spring JPA Hibernate:遅いSELECTクエリ

    さまざまなタイプのDAOをテストしました(コードが非常に汚れているため、ここでは公開しません):

    • Hibernateを使用 :〜200ms
    • (挿入された)SpringJDBCTemplateとRowMapperを使用 :〜70ミリ秒
    • Javaステートメントを使用 :〜2ミリ秒
    • JavaOracleStatementを使用 :〜5ミリ秒
    • JavaPreparedStatementを使用 :〜100ms
    • フェッチサイズ=5000で調整されたJavaPreparedStatementを使用 :〜50ms
    • JavaOraclePreparedStatementを使用 :〜100ms
    • PreFetchサイズで調整されたJavaOraclePreparedStatementを使用 =5000:〜170ms

    注:

    • new ClientDao()の代わりにSpringによって注入されたDAO :+ 30msの損失(-sick-)
    • DBへの接続時間:46ミリ秒

    私は使用できます:

    • 手動でサニタイズされたフィールドを使用したJavaステートメント。
    • アプリケーション起動時の事前接続
    • スプリングインジェクションを使用しないでください

    しかし:

    • あまり安全ではない/安全ではない
    • 少数の行では高速、多数の行のエンティティにResultSetをマップするのは低速(このユースケースもあります)

    だから:

    春のJDBCテンプレート RowMapperを使用 特定のケースでパフォーマンスを向上させるための最良のソリューションのようです。SQLクエリのセキュリティを維持できます。ただし、ResultSetをエンティティに変換するには特定のRowMapperを作成する必要があります。

    SpringJDBCTemplateの例

    @Repository
    public class ClientJdbcTemplateDao {
    
    
        private final Logger logger = LoggerFactory.getLogger(ClientJdbcTemplateDao.class);
    
        private JdbcTemplate jdbcTemplate;
    
        @Autowired
        public void setDataSource(DataSource dataSource) {
            this.jdbcTemplate = new JdbcTemplate(dataSource);
        }
    
        public List<Client> find() {
            List<Client> c = this.jdbcTemplate.query( "SELECT login FROM Client WHERE LOGIN='xxxx' AND PASSWORD='xxx'", new ClientRowMapper());
            return c;
        }
    }
    

    クライアントRowMapperの例

    public class ClientRowMapper implements RowMapper<Client> {
    
        @Override
        public Client mapRow(ResultSet arg0, int arg1) throws SQLException {
            // HERE IMPLEMENTS THE CONVERTER
            // Sample : 
            // String login = arg0.getString("LOGIN")
            // Client client = new Client(login);
            // return client;
        }
    }
    

    たぶんもっと良いかもしれません、どんな提案も歓迎します。




    1. MySql:IN演算子を使用してステートメントを選択します

    2. アンダースコアがOracleのような句で機能していません

    3. MySQLデータベースをPHPMyAdminからエクスポートしてSQLiteにインポートするにはどうすればよいですか?

    4. 他の列がnullの場合は、列を選択します